zoukankan      html  css  js  c++  java
  • 【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干了什么

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

            

  • 相关阅读:
    webpack.config.js====entry入口文件的配置
    准备工作、安装webpack、初始化项目
    git的安装
    Spring validation 后端校验【转】
    http get post 参数校验
    Spring AOP execution表达式
    spring中Constructor、@Autowired、@PostConstruct的顺序【转】
    Mockito
    Mybatis LIKE模糊查询
    PowerMock
  • 原文地址:https://www.cnblogs.com/nightOfStreet/p/13042718.html
Copyright © 2011-2022 走看看