编程范式概览:面向过程,面向对象,函数式编程,事件驱动编程,面向切面等,
AOP是什么?
Spring AOP是采用面向切面编程的编程范式,而非编程语言,它只能解决特定问题,而非所有问题,它与OOP不是替代关系,而是补充。
AOP的初衷:
DRY Don't Repeat Yourself
SoC Separation of Concerns
AOP的好处 :
集中处理某一关注点/横切逻辑,可以很方便的添加和删除关键点,侵入性少,可以增强代码可读性和可维护性。
AOP的应用场景:
权限控制,缓存控制,事务控制,审计日志,性能监控,分布式追踪,异常处理。
Pointcut Expression
1、designators
匹配方法:execution()
匹配注解:@target @args @within @annoation @
匹配包/类型 @within
匹配对象 this() bean() target()
匹配参数 args()
2、wildcards : * + ..
3、operators :&& || !
织入的时机:
代理选择:如果目标对象实现了接口口,则默认采用JDK动态代理,如果目标对象没有实现接口,则cglib进行动态代理,如果目标对象实现了接口,但强制使用cglib代理,则使用cglib代理。
开启强制使用cglib动态代理的方法:在模块启动类加@EnableAspectJAutoProxy(proxyTargetClass=true)
Aop如何实现功能叠加:采用责任链模式
注意事项:
1、不宜把重要的业务逻辑放到aop中
2、无法拦截static final private方法
3、无法拦截内部方法调用:原因是内部调用的对象是this,而非SPring容器代理的对象,解决方法有两个:1、ApplicationContextHolder获得bean,然后调用 2、用新的类去调用,不用内部调用。