书接上回,在启动类或者配置类上使用@EnableAspectJAutoProxy开启AOP
容器会将AspectJAutoProxyRegistrar注入
![](https://img.haomeiwen.com/i2959589/c8e8b1ad0666a324.png)
由于AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,所以在注册时会调用registerBeanDefinitions来注册对应的Bean
![](https://img.haomeiwen.com/i2959589/123cfecdb9afeff9.png)
可以看到registerBeanDefinitions最后注册的是AnnotationAwareAspectJAutoProxyCreator
![](https://img.haomeiwen.com/i2959589/98233e006c7a433e.png)
实际上AnnotationAwareAspectJAutoProxyCreator为Bean的后置处理器,由Spring 源码详解Bean创建 (二)知道在Bean创建完成初始化的前后会执行所有BeanPostProcessor的前置处理(postProcessBeforeInstantiation)和后置处理(postProcessAfterInitialization)
所以在Bean的初始化
![](https://img.haomeiwen.com/i2959589/dcc1fcb252a98c5c.png)
接下来举个例子介绍AOP的完整流程,创建BusService中divide方法为切点,看看AOP是如何将TestAspectJAnnotationProcess的方法织入到BusService中
![](https://img.haomeiwen.com/i2959589/475193f0c44ca7fd.png)
![](https://img.haomeiwen.com/i2959589/52dc861cebd639eb.png)
![](https://img.haomeiwen.com/i2959589/4dd9f886646923f8.png)
直接从BusService完成创建填充属性后开始初始化开始
![](https://img.haomeiwen.com/i2959589/4c4f8784e6ce0070.png)
AnnotationAwareAspectJAutoProxyCreator前置处理直接返回不做任何处理
AnnotationAwareAspectJAutoProxyCreator开始处理后置
![](https://img.haomeiwen.com/i2959589/ca2dba379c7601bd.png)
![](https://img.haomeiwen.com/i2959589/b0c2b6f4f26d87c5.png)
![](https://img.haomeiwen.com/i2959589/23bc2b09c4bbe29a.png)
![](https://img.haomeiwen.com/i2959589/af3fd963744a4c72.png)
![](https://img.haomeiwen.com/i2959589/a264420b87c39575.png)
public List<Advisor> buildAspectJAdvisors() {
List<String> aspectNames = this.aspectBeanNames;
if (aspectNames == null) {
synchronized (this) {
aspectNames = this.aspectBeanNames;
if (aspectNames == null) {
List<Advisor> advisors = new ArrayList<>();
aspectNames = new ArrayList<>();
//查出容器中所有的BeanName
String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
this.beanFactory, Object.class, true, false);
for (String beanName : beanNames) {
if (!isEligibleBean(beanName)) {
continue;
}
// We must be careful not to instantiate beans eagerly as in this case they
// would be cached by the Spring container but would not have been weaved.
Class<?> beanType = this.beanFactory.getType(beanName, false);
if (beanType == null) {
continue;
}
//将带有@Aspect注解的Bean筛选出来
if (this.advisorFactory.isAspect(beanType)) {
aspectNames.add(beanName);
AspectMetadata amd = new AspectMetadata(beanType, beanName);
if (amd.getAjType().getPerClause().getKind() == PerClauseKind.SINGLETON) {
//创建处理带有@Aspect类的Bean工厂
MetadataAwareAspectInstanceFactory factory =
new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);
//创建切面Advisor对象
List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory);
if (this.beanFactory.isSingleton(beanName)) {
this.advisorsCache.put(beanName, classAdvisors);
}
else {
this.aspectFactoryCache.put(beanName, factory);
}
advisors.addAll(classAdvisors);
}
else {
// Per target or per this.
if (this.beanFactory.isSingleton(beanName)) {
throw new IllegalArgumentException("Bean with name '" + beanName +
"' is a singleton, but aspect instantiation model is not singleton");
}
MetadataAwareAspectInstanceFactory factory =
new PrototypeAspectInstanceFactory(this.beanFactory, beanName);
this.aspectFactoryCache.put(beanName, factory);
advisors.addAll(this.advisorFactory.getAdvisors(factory));
}
}
}
this.aspectBeanNames = aspectNames;
return advisors;
}
}
}
if (aspectNames.isEmpty()) {
return Collections.emptyList();
}
List<Advisor> advisors = new ArrayList<>();
for (String aspectName : aspectNames) {
List<Advisor> cachedAdvisors = this.advisorsCache.get(aspectName);
if (cachedAdvisors != null) {
advisors.addAll(cachedAdvisors);
}
else {
MetadataAwareAspectInstanceFactory factory = this.aspectFactoryCache.get(aspectName);
advisors.addAll(this.advisorFactory.getAdvisors(factory));
}
}
return advisors;
}
![](https://img.haomeiwen.com/i2959589/dd777d35dc8f91b4.png)
![](https://img.haomeiwen.com/i2959589/71a3879fb9713113.png)
![](https://img.haomeiwen.com/i2959589/8fe62aec81079fb3.png)
![](https://img.haomeiwen.com/i2959589/ec628f600908737f.png)
![](https://img.haomeiwen.com/i2959589/9bee37271f053659.png)
![](https://img.haomeiwen.com/i2959589/61547315a94abfcc.png)
![](https://img.haomeiwen.com/i2959589/27e63b88a8af9c44.png)
![](https://img.haomeiwen.com/i2959589/417c83278980acbe.png)
如下图创建完毕的代理类回调callback_0为DynamicAdvisedInterceptor类型
![](https://img.haomeiwen.com/i2959589/6194986523aa2e3c.png)
IOC容器创建完成,执行业务方法,进入切点
![](https://img.haomeiwen.com/i2959589/1a8b5cccc0bae0b5.png)
进入CGLIB回调
![](https://img.haomeiwen.com/i2959589/463e32ae1463c467.png)
![](https://img.haomeiwen.com/i2959589/b1d491fe3f597f9a.png)
![](https://img.haomeiwen.com/i2959589/153c2daaa80af776.png)
![](https://img.haomeiwen.com/i2959589/2bfb4490ed4cfcec.png)
![](https://img.haomeiwen.com/i2959589/f873c828bf83543c.png)
![](https://img.haomeiwen.com/i2959589/f179cd64f20b78a4.png)
![](https://img.haomeiwen.com/i2959589/ec0b47f09d14611f.png)
其他几个通知节点不一一介绍,大家有兴趣可以看看源码,至此AOP代理创建以及运行时执行解析流程全部结束。
网友评论