一、setBeanFactory()方法的执行流程

先来看看AnnotationAwareAspectJAutoProxyCreator的继承关系:

AnnotationAwareAspectJAutoProxyCreator

==> 继承自AspectJAwareAdvisorAutoProxyCreator

==> 继承自AbstractAdvisorAutoProxyCreator

==> 继承自AbstractAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator最上面的父类AbstractAutoProxyCreator实现了BeanFactoryAware接口,我们知道,如果某个bean实现了BeanFactoryAware接口的话,在创建AnnotationAwareAspectJAutoProxyCreatorBean的过程中初始化方法里面会调用setBeanFactory方法:

public void setBeanFactory(BeanFactory beanFactory) {this.beanFactory = beanFactory;
}

AbstractAutoProxyCreator的子类AbstractAdvisorAutoProxyCreator重写了setBeanFactory()方法:

public void setBeanFactory(BeanFactory beanFactory) {// 调用父类(AbstractAutoProxyCreator)的setBeanFactory()方法给beanFactory属性赋值super.setBeanFactory(beanFactory);if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {throw new IllegalArgumentException("AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);}// 调用initBeanFactory来初始化通知者检索帮助类initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
}

从源码中看出,AbstractAdvisorAutoProxyCreator的setBeanFactory()方法中调用了initBeanFactory()方法:

protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 初始化通知者检索帮助类this.advisorRetrievalHelper = new BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory);
}

并且AnnotationAwareAspectJAutoProxyCreator类重写了initBeanFactory()方法,所以实际上执行的AnnotationAwareAspectJAutoProxyCreator内部的initBeanFactory()方法:

protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 调用间接父类(AbstractAdvisorAutoProxyCreator)的initBeanFactory()方法初始化通知者检索帮助类super.initBeanFactory(beanFactory);if (this.aspectJAdvisorFactory == null) {this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);}// 实例化增强器构建器对象this.aspectJAdvisorsBuilder =new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
}

以上是AnnotationAwareAspectJAutoProxyCreator类实现BeanFactoryAware接口之后内部执行的一些逻辑:

  • 设置beanFactory属性值;
  • 初始化通知者检索帮助类advisorRetrievalHelper,后面检索增强器时会用到;
  • 实例化增强器构建器对象aspectJAdvisorsBuilder,后面解析切面获取增强器时会用到;

Spring AOP原理分析(三)-- AnnotationAwareAspectJAutoProxyCreator#initBeanFactory()源码相关推荐

  1. 史上最烂 spring aop 原理分析

    盗引·中篇·spring aop spring aop: jdk 动态代理和 cglib 动态代理的特点.区别.使用方式.原理及各自对反射的优化.二者在 spring 中的统一.通知顺序.从 @Asp ...

  2. spring AOP原理分析:静态代理;JDK实现接口动态代理;Cglib继承父类代理;SpringAop的责任链模式调用

    普通静态代理 代理类和真实类都需要实现同一个接口 接口 package com.fchan.layui.represent.service; /*** 静态代理demo*/ public interf ...

  3. 跟着小马哥学系列之 Spring AOP(基于 XML 定义 Advice 源码解析)

    学好路更宽,钱多少加班. --小马哥 简介 大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间< ...

  4. 流量回放repeater的原理分析二:repeater源码分析

    前言 在上文中我们分析了sandbox-jvm(以下简称sandbox)的核心源码,了解了sandbox实现类增强的原理.并且了解了sandbox的模块化加载能力,repeater作为一个独立的模块, ...

  5. spring aop原理_Spring知识点总结!已整理成142页离线文档(源码笔记+思维导图)...

    写在前面 由于Spring家族的东西很多,一次性写完也不太现实.所以这一次先更新Spring[最核心]的知识点:AOP和IOC 无论是入门还是面试,理解AOP和IOC都是非常重要的.在面试的时候,我没 ...

  6. Spring事务原理分析(一)--@EnableTransactionManagement 到底做了什么?

    目录 一.概述 二.事务的ACID属性 三.事务的隔离级别 四.事务的传播行为 五.Spring声明式事务环境搭建 六.@EnableTransactionManagement分析 七.AutoPro ...

  7. 我的架构梦:(三)MyBatis源码分析

    mybatis的源码分析 一.传统方式源码分析 二.Mapper代理方式源码分析 三.MyBatis源码中涉及到的设计模式 一.传统方式源码分析 分析之前我们来回顾下传统方式的写法: /*** 传统方 ...

  8. modelandview使用过程_面试问烂的 Spring AOP 原理、Spring MVC 过程

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:莫那一鲁道链接:www.jianshu.com/p/e18fd44964eb Spring AOP ,SpringMVC ,这两个应该 ...

  9. Spring AOP方法分析

    Spring AOP方法分析 此示例显示如何配置Spring AOP方法概要分析.我们可以在任何服务(或其他)类中使用Spring AOP和任何方法,而无需在任何服务类中编写任何一行分析代码.面向方面 ...

  10. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

最新文章

  1. 怎么看rabbitmq的浏览器信息_买房沙盘怎么看?沙盘也可以看出很多信息的
  2. Ubuntu 配置Tomcat环境
  3. F#基础教程 大纲
  4. 基于xtrabackup GDIT方式不锁库作主从同步(主主同步同理,反向及可)
  5. Java基础语法之Map
  6. java传递实例_Java方法的参数传递机制实例详解
  7. BugkuCTF-Crypto题杰斐逊
  8. Python-复习-习题-13
  9. 这轮AI才刚刚启动,就开始有人谈AI泡沫了?
  10. eclipse没有advanced按钮_Eclipse快捷键 + 自动提示不显示问题
  11. 玩转springboot2.x 通过druid-spring-boot-starter整合Druid(Mybatis版)
  12. 中国买家团撑起2018芯片市场,华为千亿支出排名全球第三 | 盘点
  13. 今天发现的一个小问题,找不到模拟器和手机设备
  14. 平面上两直线的夹角求法解析
  15. Django重写User模型修改明文密码加密方法
  16. 蛋白质组学两个定量方法(iBAQ和LFQ)的区别及常见的标准化方法
  17. echarts世界地图国家及中国城市的经纬度数组整理
  18. 保研之路——复旦计算机学院预推免
  19. 叶聪:朋友圈爆款背后的计算机视觉技术与应用
  20. 苹果证书导出p12文件

热门文章

  1. 为资产分类定义折旧范围_SAP FICO零基础学习_0006_资产-概述和基本配置
  2. 算法:回文数字9. Palindrome Number
  3. mysql db for python_Python使用MySQLdb for Python操作数据库教程
  4. 基于用户画像的商品推荐挑战赛
  5. 480.滑动窗口中位数
  6. 使用大量数据提高算法性能的前提条件
  7. 随机梯度下降法(SGD)
  8. 公式推导 11-14
  9. jar命令成功完成 java -jar 命令却提示“没有主清单属性”!
  10. 做Data Mining,其实大部分时间都花在清洗数据