什么是AOP
AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
AOP原理
aop面向切面编程的原理就是代理:
1、静态代理
采用一些工具类对原来的类生成一个代理类,代理类以.class存在。
AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。
2、动态代理(重点,spring基于动态代理实现aop)
在运行中,通过反射生成类的代理对象,在代理对象中对原来的对象进行增强。
spring采用动态代理的技术包括:
1、基于接口生成代理对象
根据接口方法生成代理对象,对原来的代理对象进行增强
使用jdk提供反射实现
2、基于类生成代理对象
根据类生成一个子类(代理对象),在代理对象(子类)中对父类进行增强。
使用CGLib实现
通过运行代理的测试代码了解通过代理对原来对象进行增强的过程
- 4.2.1编写原始类
public interface CustomerServiceAop {
public void insertCustomer(CstCustomer cstCustomer,CstCustomerDetail cstCustomerDetail) ;
}
4.2.2编写代理对象生成代码(了解)
代理对象要对上边的CustomerServiceAop进行增强!!由于CustomerServiceAop是一个接口,使用jdk提供根据接口生成代理对象.
生成代理,测试跟踪:
基于jdk的代理(根据接口生成代理对象)
public class TransactionManagerHandler implements InvocationHandler {
//目标对象,原始对象CustomerServiceAop
private Object target;
//通过构造方法设置目标对象
public TransactionManagerHandler(Object target){
this.target = target;
}
//proxy生成的代理对象
//method目标对象方法的引用
//args目标对象方法调用的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwab