SpringCore-AOP 学习

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在各个时机插入想执行的代码

所有标注了@Admin注解的方法,在执行之前会打印出第一个参数

SpringCore-AOP实现原理

运行时织入的动态代理

当目标对象实现了接口,默认采用JDK动态代理(基于接口)JDK只能对有接口的类进行动态代理

当目标对象没有实现接口,则采用Cglib动态代理(基于继承)Cglib无法对private和static方法进行动态代理

JDK动态代理

JDK 动态代理
Proxy 类实现InvocationHandler接口
目标类基于接口

Cglib动态代理

Cglib动态代理基于继承
Proxy代理类
目标类

目标类实现了接口,用JDK动态代理

目标类没有实现接口,用Cglib动态代理

强制使用Cglib代理,使用Cglib

Spring 在 DefaultAopProxyFactory中选择代理类实现方式

SpringCore-AOP如何嵌套

责任链模式,链式调用

生成一条调用链且相互并不耦合,把调用链赋给Holder
Holder调用CallNext方法,在不超过调用链的范围内,调用Item,并将自己传递进去
运行完自己的代码,递归调用下一个Item,所以在Holder中要设置好递归边界
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。