AOP-Aspect-Oriented Programming
面向切面编程与函数式编程、面向过程编程等一样属于编程范式,所以他是一种思想而不是技术。
切面是什么?
切分功能性需求和非功能型需求。例如缓存、日志、权限控制、事务管理等。
SpringCore-AOP
Spring充分利用了IoC容器Proxy代理对象以及AOP拦截器的功能特性,通过这些对AOP基本功能的封装机制,为用户提供了AOP的实现框架。
使用@Aspect标注切面组件
使用@Pointcut()标注切入点,可以使用表达式或注解等方式
@Pointcut("@annotation(annotation.Admin)")
@Pointcut("execution(* service.AppleService.*(..))")
使用@Before、@After、@AfterReturning、@AfterThrowing、@Around在各个时机插入想执行的代码
SpringCore-AOP实现原理
运行时织入的动态代理
当目标对象实现了接口,默认采用JDK动态代理(基于接口)JDK只能对有接口的类进行动态代理
当目标对象没有实现接口,则采用Cglib动态代理(基于继承)Cglib无法对private和static方法进行动态代理
JDK动态代理
Cglib动态代理
目标类实现了接口,用JDK动态代理
目标类没有实现接口,用Cglib动态代理
强制使用Cglib代理,使用Cglib
SpringCore-AOP如何嵌套
责任链模式,链式调用