Spring容器扩展机制

318 阅读2分钟

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

前言

Spring框架解决了工程中遇到的各种难题,也是做业务工程的Java工程师必须掌握的技能, Spring框架平时大家都在使用,但是你了解Spring 生命周期中的各个扩展点吗?IoC 容器负责管理容器中所有bean的生命周期,而在 bean 生命周期的不同阶段,Spring 提供了不同的扩展点来改变 bean 的命运。

Spring框架Bean的生命周期

四个阶段

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction 实例化 -> 属性赋值 -> 初始化 -> 销毁 在这四个阶段的过程种又有很多扩展点,方便开发人员去做一些定制的操作,比如nacos配置文件加载, 一些注册实例Bean的加载顺序等等。 扩展点又可以分为影响多个Bean影响单个Bean

Spring生命周期扩展点.png

Spring容器扩展机制

BeanFactoryPostProcessor

允许我们在容器实例化相应对象之前,对注册到容器的 BeanDefinition 所保存的信息做一些额外的操作,比如修改 bean 定义的某些属性或者增加其他信息等。

自定义扩展类

通常需要实现 org.springframework.beans.factory.config.BeanFactoryPostProcessor接口,与此同时,因为容器中可能有多个BeanFactoryPostProcessor,可能还需要实现 org.springframework.core.Ordered接口,以保证BeanFactoryPostProcessor按照顺序执行。

BeanPostProcessor

其存在于对象实例化阶段。跟BeanFactoryPostProcessor类似,它会处理容器内所有符合条件并且已经实例化后的对象。简单的对比,BeanFactoryPostProcessor处理bean的定义,而BeanPostProcessor则处理bean完成实例化后的对象。

public interface BeanPostProcessor {
    // 前置处理
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    // 后置处理
    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

常见开源组件的扩展点

比如说Nacos配置中心加载,引入依赖nacos-config-spring-boot-starter, SpringBoot脚手架提供了很多的常用开源组件的starter的继承方法。原理也很渐渐基于SpringFactoriesLoader类是通过类加载器通过getResources()和getSystemResources()查找所有META-INF/spring.factories的文件,这里面的配置一般是springboot自动配置的配置类,进行初始化并缓存。

阅读这些框架源码,了解SpringBean的生命周期,和生命周期中的扩展点非常的有必要。