生命周期概览
Spring Bean 的生命周期可以分为以下阶段:
-
实例化:Spring 容器根据 Bean 的定义创建一个 Bean 的实例。这个阶段主要涉及 Bean 的实例化和依赖注入。
相关类:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、BeanWrapper、DefaultListableBeanFactory 等。
-
属性赋值:所有的 Bean 属性被设置为配置值或者默认值,这个阶段主要涉及 Bean 的属性填充。
相关类:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、BeanWrapper、DefaultListableBeanFactory 等。
-
初始化前:调用 @PostConstruct 和 InitializingBean 的实现方法,以及自定义的初始化方法。
相关类:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、InitializingBean、AbstractAutowireCapableBeanFactory 等。
-
初始化后:调用 BeanPostProcessor 的 postProcessAfterInitialization 方法,以及自定义的初始化方法。
相关类:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、AbstractAutowireCapableBeanFactory 等。
-
销毁前:调用 @PreDestroy 和 DisposableBean 的实现方法,以及自定义的销毁方法。
相关类:DisposableBean、AbstractAutowireCapableBeanFactory 等。
-
销毁:Spring 容器销毁 Bean 对象,释放资源。
相关类:DisposableBean、AbstractAutowireCapableBeanFactory 等。
其中,InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor 是 Spring Framework 中常用的扩展点,用于在 Bean 的生命周期中拦截和处理 Bean 对象。AbstractAutowireCapableBeanFactory 是 Spring Framework 中的一个重要实现类,实现了 Bean 对象的创建、属性注入、初始化和销毁等功能。DefaultListableBeanFactory 则是 AbstractAutowireCapableBeanFactory 的子类,实现了 Bean 的注册和查找等功能。
主要类的作用和常用方法的详细说明
BeanFactoryPostProcessor
接口
该接口的作用是在 Spring 容器初始化之后,但是在 Bean 实例化之前,对 BeanFactory 进行修改。它提供了一个方法 postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
,该方法可以实现对 BeanFactory 的配置元数据进行修改,例如添加新的 BeanDefinition 等。
常用方法:
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
: 该方法在 BeanFactory 标准初始化之后、任何 bean 被实例化之前被调用。可以通过该方法修改 BeanFactory 的配置元数据,例如添加新的 BeanDefinition 等。
BeanPostProcessor
接口
该接口的作用是在 Spring 容器完成 Bean 实例化和属性注入之后,但是在调用 Bean 的初始化方法之前和之后,对 Bean 实例进行自定义的初始化和销毁操作。它提供了两个方法 postProcessBeforeInitialization(Object bean, String beanName)
和 postProcessAfterInitialization(Object bean, String beanName)
,分别对应 Bean 初始化前和初始化后的操作。
常用方法:
-
postProcessBeforeInitialization(Object bean, String beanName)
: 该方法在 Bean 对象实例化后、依赖注入完成后、初始化方法调用之前被调用。可以在该方法中自定义 Bean 对象的初始化逻辑。 -
postProcessAfterInitialization(Object bean, String beanName)
: 该方法在 Bean 对象实例化后、依赖注入完成后、初始化方法调用之后被调用。可以在该方法中自定义 Bean 对象的销毁逻辑。
InstantiationAwareBeanPostProcessor
接口
该接口继承了 BeanPostProcessor
接口,增加了对 Bean 实例化前的处理方法 postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
和对属性进行修改的方法 postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
。
常用方法:
-
postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
: 该方法在 Bean 对象实例化之前被调用,可以在该方法中返回一个代理对象来替代原始的 Bean 对象实例。 -
postProcessAfterInstantiation(Object bean, String beanName)
: 该方法在 Bean 对象实例化之后、依赖注入完成之后、初始化方法调用之前被调用。可以在该方法中告知 Spring 容器是否需要继续对该 Bean 对象进行属性注入和初始化等操作。 -
postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
: 该方法在 Bean 对象的属性填充之后、初始化方法调用之前被调用。可以在该方法中修改 Bean 对象的属性值。
InitializingBean
接口
该接口提供了一个方法 afterPropertiesSet()
,在 Bean 对象的所有属性被设置完毕之后调用。可以在该方法中自定义 Bean 对象的初始化逻辑。
常用方法:
afterPropertiesSet()
: 该方法在 Bean 对象的所有属性被设置完毕之后调用。可以在该方法中自定义 Bean 对象的初始化逻辑。
DisposableBean
接口
该接口提供了一个方法 destroy()
,在 Bean 对象被销毁之前调用。可以在该方法中自定义 Bean 对象的销毁逻辑。
常用方法:
destroy()
: 该方法在 Bean 对象被销毁之前调用。可以在该方法中自定义 Bean 对象的销毁逻辑。
AbstractAutowireCapableBeanFactory
类
该类是 Spring Bean Factory 的一个抽象实现,提供了创建 Bean 对象、属性注入、初始化和销毁等方法的默认实现,可以用于定制自己的 Bean Factory 实现。
常用方法:
-
createBean(Class<T> beanClass)
: 根据指定的类型创建一个 Bean 对象。 -
doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
: 根据指定的 BeanDefinition 和构造函数参数创建一个 Bean 对象。 -
applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
: 在 Bean 的初始化方法调用之前,对 Bean 进行后置处理。 -
applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
: 在 Bean 的初始化方法调用之后,对 Bean 进行后置处理。 -
destroyBean(Object bean)
: 销毁指定的 Bean 对象,包括调用DisposableBean
接口的destroy()
方法和自定义的销毁逻辑。
AbstractBeanFactory
类
该类是 BeanFactory
接口的抽象实现,提供了创建 Bean 对象、获取 Bean 对象、Bean 的生命周期管理等方法的默认实现。
常用方法:
-
containsBean(String name)
: 判断是否存在指定名称的 Bean 对象。 -
getType(String name)
: 获取指定名称的 Bean 对象的类型。 -
getBean(String name)
: 根据指定名称获取一个 Bean 对象。 -
getBean(String name, Class<T> requiredType)
: 根据指定名称和类型获取一个 Bean 对象。 -
getBeanDefinition(String beanName)
: 获取指定名称的 BeanDefinition 对象。 -
registerSingleton(String name, Object singletonObject)
: 注册一个单例 Bean 对象。 -
destroySingletons()
: 销毁所有的单例 Bean 对象,包括调用DisposableBean
接口的destroy()
方法和自定义的销毁逻辑。
ConfigurableBeanFactory
接口
该接口是 BeanFactory
接口的子接口,增加了对 Bean 的生命周期管理的方法,例如添加 BeanPostProcessor、添加 BeanFactoryPostProcessor 等。
常用方法:
-
addBeanPostProcessor(BeanPostProcessor beanPostProcessor)
: 添加一个 BeanPostProcessor。 -
addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor)
: 添加一个 BeanFactoryPostProcessor。 -
registerAlias(String beanName, String alias)
: 注册一个 Bean 别名。
ApplicationContext
接口
该接口是 Spring 应用上下文的核心接口,扩展了 BeanFactory
接口,提供了更多的应用上下文级别的功能,例如事件发布、国际化支持等。
常用方法:
-
getBean(String name)
: 根据指定名称获取一个 Bean 对象。 -
getBean(Class<T> requiredType)
: 根据指定类型获取一个 Bean 对象。 -
publishEvent(ApplicationEvent event)
: 发布一个应用事件。 -
getMessage(String code, Object[] args, String defaultMessage, Locale locale)
: 获取国际化信息。
释疑
InstantiationAwareBeanPostProcessor
和 BeanPostProcessor
接口的主要区别在于方法的调用时机和提供的回调方法的不同。
BeanPostProcessor
接口提供了两个回调方法 postProcessBeforeInitialization
和 postProcessAfterInitialization
,用于在 Bean 初始化前和初始化后对 Bean 进行自定义的初始化和销毁操作。
而 InstantiationAwareBeanPostProcessor
接口继承了 BeanPostProcessor
接口,并且提供了三个额外的回调方法,用于在 Bean 实例化前、实例化后和属性填充后对 Bean 进行自定义的处理:
-
postProcessBeforeInstantiation
: 在 Bean 实例化之前调用,可以返回一个代理对象来替代原始的 Bean 对象实例。 -
postProcessAfterInstantiation
: 在 Bean 实例化之后、依赖注入完成之后、初始化方法调用之前被调用。可以在该方法中告知 Spring 容器是否需要继续对该 Bean 对象进行属性注入和初始化等操作。 -
postProcessPropertyValues
: 在 Bean 对象的属性填充之后、初始化方法调用之前被调用。可以在该方法中修改 Bean 对象的属性值。
因此,相较于 BeanPostProcessor
接口,InstantiationAwareBeanPostProcessor
接口提供了更多的回调方法,使得我们可以在更多的时机进行自定义的处理。一般情况下,如果只需要在 Bean 的初始化前和初始化后进行自定义的处理,可以直接实现 BeanPostProcessor
接口;如果需要在更多的时机进行自定义处理,可以实现 InstantiationAwareBeanPostProcessor
接口。