2、AnnotationAwareAspectJAutoProxyCreator的解析

@Override 

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

if (bean != null) {

Object cacheKey = getCacheKey(bean.getClass(), beanName);

if (!this.earlyProxyReferences.contains(cacheKey)) {

return wrapIfNecessary(bean, beanName, cacheKey);

}

}

return bean;

}



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;

}

// 寻找需要增强器 切面

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;

}


AnnotationAwareAspectJAutoProxyCreator 实现了BeanPostProcessor,为需要增强的bean创建代理。重点是寻找需要增强器



@Overrideprotected Object[] getAdvicesAndAdvisorsForBean(ClassbeanClass, String beanName, TargetSource targetSource) { Listadvisors = findEligibleAdvisors(beanClass, beanName);

if (advisors.isEmpty()) {

return DO_NOT_PROXY;

}

return advisors.toArray();

}


若不存在切面,则不需要创建代理


protected ListfindEligibleAdvisors(ClassbeanClass, String beanName) {  

ListcandidateAdvisors = findCandidateAdvisors();

ListeligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);

extendAdvisors(eligibleAdvisors);

if (!eligibleAdvisors.isEmpty()) {

eligibleAdvisors = sortAdvisors(eligibleAdvisors);

}

return eligibleAdvisors;

}


@Override protected List findCandidateAdvisors() {

List advisors = super.findCandidateAdvisors();

advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors());

return advisors;

}

下面分析findCandidateAdvisors方法寻找所有的切面,super.findCandidateAdvisors()寻找 例如xml或其他定义的切面 ,下面aspectJAdvisorsBuilder.buildAspectJAdvisors()寻找@aspect定义得切面。

接下来再对该实现进行探讨

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 989评论 0 1
  • 共享经济,是在互联网快速发展条件下,充分发挥系列闲置资源,用活社会的潜在价值,让市场充分释放去库存压力。从而达到市...
    熏莉阅读 312评论 0 0
  • 5点45分,生物钟已经醒来,赖床,闹钟响起,打开手机,收到新客户确认订单的信息,回复了信息,确认了付款方式,打开微...
    trista_chow阅读 169评论 0 0
  • 任务81.块级元素和行内元素有哪些+区别2.什么是 CSS 继承? 哪些属性能继承,哪些不能3. 如何让块级元素水...
    好奇而已阅读 297评论 0 2