我们之前开发是使用三层架构的方式,每做一个模块都要开发他的表现层、业务层、数据层。
即OOP模式,我们关心的是一一个模块中的功能。
所以在开发中,就会有较多相似的代码。
什么是AOP?例如下述代码,我们可以从中抽取出共性的代码,使用AOP,在运行的时候,再将该环境还给对象。
AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构
AOP弥补了OOP的不足,基于OOP基础之上进行横向开发
OOP规定程序开发以类为主体模型,一切围绕对象进行,完成某个任务先构建模型
AOP程序开发主要关注基于OOP开发中的共性功能,一切围绕共性功能进行,完成某个任务先构建可能遇到的所有共性功能(当所有功能都开发出来也就没有共性与非共性之分)
AOP的作用
伴随着AOP时代的降临,可以从各个行业的标准化、规范化开始入手,一步一步将所有共性功能逐一开发完毕,最终以功能组合来完成个别业务模块乃至整体业务系统的开发
目标:将软件开发由手工制作走向半自动化/全自动化阶段,实现“插拔式组件体系结构”搭建
AOP优势
提高代码的可重用性
业务代码编码更简洁
业务代码维护更高效
业务功能扩展更便捷
AOP入门案例 AOP相关概念 (1)连接点不管是接口中的方法,还是实现类中的方法,只要是一个方法叫做连接点
(2)切入点在后期会被抽取出共性功能的方法,叫做切入点。
切入点和连接点都是方法;但是连接点是指所有方法,而切入点只是指被抽取出共性功能的方法。
(3)通知被挖掉的共性功能叫做通知,最终以一个方法的形式呈现。
(4)切面切入点与通知间的关系叫做切面,即:共性功能与挖的位置的对应关系
(5)目标对象挖掉功能的方法对应的类产生的对象,这种对象是无法直接完成最终工作的。
(6)织入目标对象是不能直接运行的,我们只有将其原始功能“放回去”才可以运行。这个放回去的过程叫做织入。
(7)代理目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现
小结
Joinpoint(连接点):就是方法
Pointcut(切入点):就是挖掉共性功能的方法
Advice(通知):就是共性功能,最终以一个方法的形式呈现
Aspect(切面):就是共性功能与挖的位置的对应关系
Target(目标对象):就是挖掉功能的方法对应的类产生的对象,这种对象是无法直接完成最终工作的
Weaving(织入):就是将挖掉的功能回填的动态过程
Proxy(代理):目标对象无法直接完成工作,需要对其进行功能回填,通过创建原始对象的代理对象实现
Introduction(引入/引介) :就是对原始对象无中生有的添加成员变量或成员方法
AOP开发过程
开发阶段(开发者完成)
正常的制作程序
将非共性功能开发到对应的目标对象类中,并制作成切入点方法
将共性功能独立开发出来,制作成通知
在配置文件中,声明切入点
在配置文件中,声明切入点与通知间的关系(含通知类型),即切面
简单来说就是——做通知、做切入点、做切面!
运行阶段(AOP完成)
Spring容器加载配置文件,监控所有配置的切入点方法的执行
当监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置将通知对应的功能织入,完成完整的代码逻辑并运行
AOP入门案例 项目骨架 详细代码UserServiceImpl实现类
public class UserServiceImpl implements UserService {
public void save() {
//被AOP抽取
//System.out.println("共性功能");
System.out.println("User Service running...");
}
}
AOPAdvice
//1.制作通知类,在一个类中定义一个方法用来完成共性功能
public class AOPAdvice {
public void function() {
System.out.println("共性功能");
}
}
applicationContext.xml
UserApp程序运行入口
public class UserApp {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.save();
}
}
代码分析
我们重点关注XML文件中的内容即可。
在AOP中,需要我们手写的只有配置切入点、配置通知、配置它们之间的关系切面。(3个东西)
:表示aop的配置,是一对标签,里面写配置内容。
:配置切入点,里面有两个属性 id和execution(表达式)
:配置切面,也是一对标签,里面有属性ref 表示哪一个通知对应的类。
:从原来的方法中的哪一个位置“挖来的”。before表示前面挖来的。
这只是大致描述,详细的请看下文!
AOP配置(XML) AspectJ
Aspect(切面)用于描述切入点与通知间的关系,是AOP编程中的一个概念
AspectJ是基于java语言对Aspect的实现
AOP配置 (1)aop:config (2)aop:aspect (3)aop:pointcut 切入点 切入点表达式的组成 切入点的三种配置方式 通知类型


