Spring IOC加载过程 Bean的生命周期

97 阅读3分钟

1. 什么是IOC

IOC:控制反转,也可以被称为依赖注入

谁控制谁?

  • 在以前,对象的创建和销毁都是由用户控制的
  • 用了 IOC 之后,对象的创建和销毁就都交给容器来控制了

image-20240611162733742

什么是反转?

  • 正转是对象去找实例
  • 反转时让实例去找对象

image-20240611162837759

谁依赖谁?

在Spring项目中,将对象理解为Bean,也可以叫Bean对象,这个bean和容器之间有个依赖关系,bean对象的创建时依赖容器的。就好像孩子依赖父母一样

image-20240611163026112

谁注入谁?

通过容器注入了bean对象,而且这个过程是自动化的,也就是说容器会自动找到和bean对象匹配的类型注入到对象中

image-20240611163135008

2. Spring ioc的加载过程

image-20240611164343218

  1. 首先,通过BeanDefinitionReader读取指定的配置文件生成bean的定义信息,然后到完整的bean定义信息(BeanDefinition对象)注意这里只是存储bean的定义信息,还没有实例化对象

  2. 在 BeanDefinition 和完整 BeanDefintion 中间通过一个后置增强器,可以对bean的定义信息进行统一修改,只需要实现 BeanFactoryPostProcessor接口即可

     package com.Spring.Boot.init;
     import org.springframework.beans.BeansException;
     import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
     import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
     import org.springframework.stereotype.Component;
     /**
      * 扩展方法--后置增强器(可修改bean的定义信息)
      */
     @Component
     public class ExtBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
         @Override
         public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
     //        BeanDefinition studentService = beanFactory.getBeanDefinition("studentService");
             System.out.println("扩展方法--可进行修改beanDefinition的定义信息");
         }
     }
    
  3. 得到完整BeanDefinition之后就可以进行创建对象了,创建对象这整个过程被称为bean的声明周期,也就是实例到销毁的过程,请看下面

3.Bean的生命周期

生命周期:从对象的创建到使用到销毁的过程,如下图:

image-20240611203547601

1. 实例化:

  • 在堆空间中申请空间,对象的属性值一般是默认值,反射创建对象的过程——createBeanInstance方法

2.初始化:

  • 属性赋值:

    • 自定义属性赋值—— populateBean 进行set方法完成赋值操作
    • 检查aware相关接口并设置依赖:容器对象属性赋值,就是需要容器资源赋给Bean,例如BeanFactory ——在 invokeAwareMethods 判断实现

      执行到此步骤之后,对象的创建和属性都完成了,那么此时对象是否可以直接拿来使用了?理论上是可以的,但是Spring要考虑扩展性

  • 如关联BeanPostProcessor:执行前置处理方法:可以对Bean进行预处理工作,比如Bean的属性进行修改或者校验等

  • 执行初始化方法:如果Bean在Spring配置文件中配置了init-method属性会调用其配置的初始化方法 —— invokeInitMethods

    • invokeInitMethods 中实现初始化,此方法还有另一个功能: 检测bean是否实现了InitializingBean接口 ,如果实现了此接口,可以调用afterPropertiesSet方法(也可以自行扩展)
  • 如关联BeanPostProcessor:执行后置处理方法:例如:Bean对象的扩展实现:AOP ->进行动态代理

    • 可知:AOP是IOC整体流程中的一个扩展点

3. 使用:

  • 得到实例对象,直接使用实例对象

4.销毁:

  • 当Bean不在需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,或者根据spring配置的destroy-method属性,调用实现的destroy()方法

学习文章:Spring IOC详解及Bean生命周期详细过程,看完直接吊打面试官! - 掘金 (juejin.cn)