一、概念
1. 编程范式概览:
1. 面向过程编程
2. 面向对象编程
3. 面向切面编程
4. 函数式编程
5. 事件驱动编程
2. Aop的初衷:
1. 解决代码重复问题
2. 分离非功能性需求和功能性需求
二、代理详解
1. 静态代理 :
1. 静态代理接口
2. 真实对象
3. 代理对象
4. 调用代理对象的方法
注:当真实对象每添加一个方法的时候,静态代理对象相应的也要添加一个方法(在源码层面),很麻烦,不灵活。
2. 动态代理 - 基于JDK :
1. 代理对象
2. 调用代理对象的方法
注:基于JDK的动态代理,会生成一个存放真实对象方法信息的class文件,在运行期间动态调用代理对象的方法,当真实对象增加方法时,也无需修改代理对象。
3. 动态代理 - 基于Cglib :
1. 代理对象
2. 调用代理对象的方法
三、Spring Aop
1. 选择JDK还是Cglib :
①如果目标对象实现了接口,则默认采用JDK动态代理
②如果目标对象没有实现接口,则采用Cglib动态代理
③如果目标对象实现了接口,且强制Cglib代理,则使用Cglib动态代理
2. 链式调用 :
Spring采用责任链模式递归地调用同一个真实对象的多个代理方法。
3. Aop经典应用场景 :
①事务控制:@Transcational
②安全校验:@PreAuthorize
③缓存控制:@Cacheable
四、使用Spring Aop注意事项
①不宜把重要的业务逻辑放在Aop中处理
②无法拦截static、final、private修饰的方法
③无法拦截内部方法调用