1.refresh()-->registerBeanPostProcessorss(beanFactory) 方法:注册bean的后置处理器
2.springAOP,通过后置处理进行处理的;
3.@Enabel AspectJAutoProxy: enabel -- 启动的意思
4.查看类关系图表:Ctrl+Shift+Alt+U
5.@EnableAspectJAutoProxy -->@Import(AspectJAutoProxyRegistrar.class){
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry) --> registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry, (Object)null) --> registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source) {
AnnotationAwareAspectJAutoProxyCreator关系图
--> implements ImportBeanDefinitionRegistrar
6.核心类:AbstractAutoProxyCreator
--> 1.setBeanFactory[子类AbstractAdvisorAutoProxyCreator重写]
--> 2.postProcessBeforeInstantition () {
-->1.shouldSkip[子类AspectJAwareAdvisorAutoProxyCreator重写] }
--> 3.postProcessAfterInstantition()
Object cacheKey = this.getCacheKey(beanClass, beanName);
if (beanName == null || !this.targetSourcedBeans.contains(beanName)) {
if (this.advisedBeans.containsKey(cacheKey)) {
return null;
}
//判断是否基础的bean || 或者是否应该跳过
if (this.isInfrastructureClass(beanClass) || this.shouldSkip(beanClass, beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return null;
}
}
if (beanName != null) {
TargetSource targetSource = this.getCustomTargetSource(beanClass, beanName);
if (targetSource != null) {
this.targetSourcedBeans.add(beanName);
Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
Object proxy = this.createProxy(beanClass, beanName, specificInterceptors, targetSource);
this.proxyTypes.put(cacheKey, proxy.getClass());
return proxy;
}
}
/******************** shouldSkip ************************/
protected boolean shouldSkip(Class<?> beanClass, String beanName) {
//查询候选增强器
List<Advisor> candidateAdvisors = this.findCandidateAdvisors();
Iterator var4 = candidateAdvisors.iterator();
Advisor advisor;
do {
if (!var4.hasNext()) {
return super.shouldSkip(beanClass, beanName);
}
advisor = (Advisor)var4.next();
} while(!(advisor instanceof AspectJPointcutAdvisor) || !((AbstractAspectJAdvice)advisor.getAdvice()).getAspectName().equals(beanName));
return true;
}
/******************** findCandidateAdvisors one************************/
protected List<Advisor> findCandidateAdvisors() {
//通过切面探索工具查询候选增强(事务切面)
return this.advisorRetrievalHelper.findAdvisorBeans();
}
public List<Advisor> findAdvisorBeans() {
//先从缓存中获取增强器,cachedAdvisorBeanNames是advisor的名称
String[] advisorNames = this.cachedAdvisorBeanNames;
if (advisorNames == null)
//从IOC容器中查询实现Advistor接口组件的名称
advisorNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this.beanFactory, Advisor.class, true, false);
//赋值给增强器缓存
this.cachedAdvisorBeanNames = advisorNames;
}
if (advisorNames.length == 0) {
return new ArrayList();
} else {
List<Advisor> advisors = new ArrayList();
String[] var3 = advisorNames;
int var4 = advisorNames.length;
for(int var5 = 0; var5 < var4; ++var5) {
String name = var3[var5];
if (this.isEligibleBean(name)) {
if (this.beanFactory.isCurrentlyInCreation(name)) {
if (logger.isDebugEnabled()) {
logger.debug("Skipping currently created advisor '" + name + "'");
}
} else {
try {
advisors.add(this.beanFactory.getBean(name, Advisor.class));
} catch (BeanCreationException var10) {
Throwable rootCause = var10.getMostSpecificCause();
if (rootCause instanceof BeanCurrentlyInCreationException) {
BeanCreationException bce = (BeanCreationException)rootCause;
if (this.beanFactory.isCurrentlyInCreation(bce.getBeanName())) {
if (logger.isDebugEnabled()) {