AOP(Aspect Orient Programming) 面向切面编程是通过运行期动态代理实现程序功能的统一维护的一种技术,从动态角度考虑程序运行的。
AOP底层就是采用动态代理模式实现的,采用了两种代理:JDK动态代理与CGLIB
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。
面向切面编程就是将交叉业务逻辑封装成切面,利用AOP容器的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的与主业务无关的逻辑代码,如安全检查、事务、日志、缓存等。
若不使用AOP则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起,这样会使主业务逻辑变得混杂不清。
1、动态代理
实现方式:jdk动态代理,使用jdk中的Proxy, Method, InvocationHandler创建代理对象
jdk动态代理要求目标类必须实现接口
cglib动态代理:第三方的工具库,创建代理对象,原理是继承。通过继承目标类,创建子类。子类就是代理对象。要求目标类不能是final,方法也不能是final
2、动态代理的作用
- 在目标类源代码不改变的情况下增加功能
- 减少代码的重复
- 专注业务逻辑代码
- 解耦合,让业务功能和日志、事务等非业务功能分离
3、AOP :面向切面编程,基于动态代理,可以使用jdk、cglib两种代理方式
AOP 就是动态代理的规范化(把动态代理的实现步骤和方式都定义好了,让开发人员用一种统一的方式使用动态代理)
Aspect : 切面,给目标类增加功能就是切面(像日志、事务);特点(一般是非业务方法,可以独立使用)
术语:
- Aspect : 切面,表示增强的功能,就是一对代码完成某一个功能,非业务功能,常见的切面功能有日志、事务、统计信息、参数检查、权限验证
- JointPoint:连接点,连接业务方法和切面的位置(某类中的业务方法)
- PointCut: 切入点,指多个连接点方法的集合,多个方法
- Advice: 通知,通知表示切面功能的执行的时间
怎么理解面向切面编程?
- 需要早分析项目功能时,找出切面
- 合理的安排其切面的执行时间(在目标方法前,还是在目标方法后)
- 合理的安排切面执行的位置,在哪个类,哪个方法增加增强功能
aspectJ:一个开源的专门做AOP的框架,spring中集成了aspectJ,通过spring就能使用aspectJ的功能。
aspectJ实现AOP有两种方式:
1.使用XML 的配置文件:配置全局事务
2.使用注解,在项目中做AOP功能一般使用注解
@Before、
@AfterReturning、
@Around 、
@AfterThrowing、
@After
创建切面类
在类的上面加入@Aspect
- 在类中定义方法,方法就是切面要执行的功能代码
- 在方法的上面加入aspectj中的通知注解,例如@Before
- 有需要指定切入点表达式execution()
创建spring配置文件:声明对象,把对象交给容器统一管理,声明对象可以使用注解或者xml配置文件
- 声明目标对象
- 声明切面对象
- 生命aspectj框架中的自动代理生成器标签,自动代理生成器:用来完成代理对象的自动创建功能