【Spring】IOC容器到底是咋肥事啊?

菜瓜:网上整天说的IOC容器是个啥啊?

水稻:IOC?就是Inversion of Control,控制反转啊

菜瓜:soga,原来是控制反转啊,我知道了!你这不是等于白说吗?

水稻:别急,听我慢慢说(概念只是为了帮助人们去理解的辅助工具):

  • 作为一个正常的Javaer,如果没有Spring,我们在A对象里面用到B对象,是不是要自己创建或者引用B,这些操作都是由调用者A来控制
  • 来到熟悉的Spring,直接使用@Autowired注入B开箱即用,A不用再管B的创建啥的,只需要有个装B的容器给A分配就行了。这个容器就是IOC容器

菜瓜:哦,就是A引用B本来由自己创建的,结果变成了IOC容器分配对象了。且如果有多个对象之间存在引用关系就省了好多代码?

水稻:deideidei,那你知道Spring的IOC容器初始化是咋做的吗?

菜瓜:如果是我的话,就利用工厂,在项目启动的时候将所有的对象封装到一个大的容器里面,就是上次我们说的那个工厂模式稍微改造一下,把创建出来的对象存起来,用的时候再去取。

水稻:思路正确,接下来进入你最喜欢的源码解析环节。Spring启动的过程其实也是IOC容器初始化的过程,以SpringBoot为例

  • 先介绍几个重点对象,再看流程
  • AbstractApplicationContext:核心方法refresh()定义了Spring容器的整个初始化流程 - 模板方法模式(你懂的)
    AnnotationConfigApplicationContext:以注解方式启动Spring容器时的上下文。
    - 初始化它的时候会调用方法AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
    - 该方法会注册BeanPostProcessor接口的实现类信息到BeanDefinitionNames中,最为关键的ConfigurationClassPostProcessor为SpringBoot启动类上的注解提供了支撑 BeanFactoryPostProcessor接口:对BeanFactory指指点点 BeanPostProcessor接口:对Bean的信息指指点点 - 你知道的@Autowired@Resource@ComponentScan@Bean@Import@Configuration注解都是它的实现类来解析的
  • 假设你看过SpringBoot的启动类源码(你点一下那个run方法跟进去找)能发现流程中反射初始化了AnnotationConfigApplicationContext类,然后调用AbstractApplicationContext的refresh方法,对容器进行初始化
  • 第一步是创建BeanFactory工厂,过程中会解析xml标签并将其封装成BeanDefinition对象
  • 接下来会初始化BeanFactoryPostProcessor和BeanPostProcessors实现类对象,该过程会搜集注解形式配置的bean对象放入容器BeanDefinitionNames容器
  • 最后遍历BeanDefinitionNames容器,挨个实例化对象,放入工厂中

菜瓜:流程我大概清楚了,里面还有好多细节还是懵的。想具体了解一下注解是怎么扫描的。BeanDefinition是什么。BeanPostProcessors干了什么

水稻:这个我也还整不太灵清。我得下去再看看

        

 

posted @ 2020-06-04 12:15  渠成  阅读(153)  评论(0编辑  收藏  举报