目录
简介
- spring aop 基于动态代理,如果使用接口的,利用jdk提供的动态代理,没有接口的利用CGLIB实现.spring-core中把CGLIB和ASM的源码包含进来了,所以不用引包
- AOP依赖与IOC,在IOC启动的时候会创建代理实例,因此Spring中的AOP也只能作用于托管至IOC中的bean.
目标对象创建代理对象(jdk或者cglib)。然后启用代理对象的拦截器来完成各种切面的织入(在调用目标对象方法时会触发方法增强)。
这一系列的织入是通过Adapter来实现的。
通过Adapter把切面和Proxy有机的结合在一起。
AOP切面是Spring中对分散在类中公共方法的解决方案,Proxy代理是对此方案的技术实现。
要明确的基本概念
- advice 通知: 定义在连接点做什么,为切面增强提供织入接口。在SpringAOP中,他主要描述SpringAOP围绕方法调用而注入的切面行为。如:BeforeAdvice,AfterAdvice,ThrowsAdvice。
- pointcut 切点: 决定Advice通知应该作用于哪些连接点。通过PointCut来定义需要增强的方法集合。
- advisor 通知器: 通过Advisor,可以定义应用应该使用哪个通知并在哪个关注点使用它,通过Advisor,把Advice和PointCut结合起来。
应用场景
- AOP本身的功能: 把横跨多个模块的功能抽成一个切面.
- spring内部一些模块也通过AOP实现,如事务.
使用
pointCut
匹配规则:
下列匹配模式中,
- “.” 代表一个包名
- “..” 代表包及其子包
- 方法参数任意匹配使用两个点 “..”。
1
2
3
4
5
6
7
8// 正则
// 所在类或包内
// @annotation:方法上具有特定的注解,如 @Subscribe 用于订阅特定的事件。
// 匹配 bean 的名字aop
AOP中,DefaultAdvisorAutoProxyCreator 类了,实现自动将所有的 advisor 生效。
重要的类
1 | /** |
bean-post-processor
1 | protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { |
1 |
|
织入时期
1 | /** |