1.AnnotationAwareAspectJAutoProxyCreator作为一个BeanPostProcessor,在postProcessAfterInitialization()中时执行了AbstractAutoProxyCreator.wrapIfNecessary();
2.在执行wrapIfNecessary的时候,创建代理对象之前,首先要通过getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null)方法获取specificInterceptors,即advice和advisor
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
if (beanName != null && this.targetSourcedBeans.contains(beanName)) {
return bean;
}
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
}
if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
// Create proxy if we have advice.
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
if (specificInterceptors != DO_NOT_PROXY) {
this.advisedBeans.put(cacheKey, Boolean.TRUE);
Object proxy = createProxy(
bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
this.proxyTypes.put(cacheKey, proxy.getClass());
return proxy;
}
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
1.下面主要就是看下getAdvicesAndAdvisorsForBean这个方法了
protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource targetSource) {
List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
if (advisors.isEmpty()) {
return DO_NOT_PROXY;
}
return advisors.toArray();
}
2.没什么好说的,那接着看下findEligibleAdvisors(beanClass, beanName);这个方法吧
protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
//2.1
List<Advisor> candidateAdvisors = findCandidateAdvisors();
//3.1
List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
//4.1
extendAdvisors(eligibleAdvisors);
if (!eligibleAdvisors.isEmpty()) {
eligibleAdvisors = sortAdvisors(eligibleAdvisors);
}
return eligibleAdvisors;
}
2.1下面看下findCandidateAdvisors();
protected List<Advisor> findCandidateAdvisors() {
// Add all the Spring advisors found according to superclass rules.
//这里返回的是一个空数组,就不再看这个方法了
List<Advisor> advisors = super.findCandidateAdvisors();
// Build Advisors for all AspectJ aspects in the bean factory.
//下面还是要着重看下这个方法
advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors());
return advisors;
}
2.2 buildAspectJAdvisors() 。从advisorsCache中获取对应的Advisor
public List<Advisor> buildAspectJAdvisors() {
/**
* 这里省略一些代码(没执行)
*/
List<Advisor> advisors = new LinkedList<Advisor>();
//aspectNames=["logAspect"]
for (String aspectName : aspectNames) {
//在这里获取Advisor advisorsCache是一个Map,执行到这里的时候已经是有值了的
//private final Map<String, List<Advisor>> advisorsCache = new ConcurrentHashMap<String, List<Advisor>>();
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;
}
3.1 执行过findCandidateAdvisors();之后,接着执行findAdvisorsThatCanApply()。这个方法是循环获取到advisor,然后只留下能够匹配当前类的advisor。
4.1 findAdvisorsThatCanApply()。执行过后执行extendAdvisors(eligibleAdvisors);这个方法就是判断advisors是否包含AspectJ advice,如果有,就在数组中开头位置添加一个ExposeInvocationInterceptor.ADVISOR