Spring框架中Bean的生命周期

发布时间:2024年01月21日

编程笔记:Spring框架中Bean的生命周期

1. 概念

在Spring框架中,Bean的生命周期指的是从Bean被创建到被销毁的整个过程。Spring容器负责管理Bean的生命周期,确保在适当的时机调用相应的方法。

2.Bean生命周期的五个阶段

Spring框架中Bean的生命周期主要包括以下阶段:

  • 实例化(Instantiation): Bean的实例被创建。
  • 属性注入(Population): Spring容器通过依赖注入等方式设置Bean的属性。
  • 初始化(Initialization): 如果Bean实现了InitializingBean接口或在配置文件中配置了初始化方法,这些方法会在Bean初始化时被调用。
  • 使用(In Use): Bean被应用程序使用。
  • 销毁(Destruction): 如果Bean实现了DisposableBean接口或在配置文件中配置了销毁方法,这些方法会在容器销毁时被调用。

3.代码示例

### 3.1实例化
<!-- 配置文件中定义Bean -->
<bean id="myBean" class="com.example.MyBean"/>

### 3.2 属性注入
<!-- 通过属性注入设置Bean属性 -->
<bean id="myBean" class="com.example.MyBean">
    <property name="propertyName" value="propertyValue"/>
</bean>

### 3.3 初始化
<!-- 在配置文件中定义初始化方法 -->
<bean id="myBean" class="com.example.MyBean" init-method="initMethod"/>

### 3.4 使用
// 在应用程序中使用Bean
MyBean myBean = (MyBean) context.getBean("myBean");
myBean.doSomething();

### 3.5 销毁
<!-- 在配置文件中定义销毁方法 -->
<bean id="myBean" class="com.example.MyBean" destroy-method="destroyMethod"/>

4.管理bean

Spring框架通过BeanPostProcessor、InitializingBean和DisposableBean等接口以及配置文件中的init-method和destroy-method属性来管理Bean的生命周期。

Spring提供 BeanPostProcessor 接?来进?扩展。其中,BeanPostProcessor 接?定义了两个?法postProcessBeforeInitialization 和 postProcessAfterInitialization,分别在 Bean 的初始化前后被调?,?于扩展 Bean 初始化的过程;

public class CustomBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在Bean初始化方法执行前进行处理
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 在Bean初始化方法执行后进行处理
        return bean;
    }
}


public class MyBean implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化逻辑
    }
}


public class MyBean implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        // 销毁逻辑
    }
}

如:在实际开发中,经常需要在Bean初始化时执行一些逻辑,例如数据初始化、资源加载等。
public class MyBean implements InitializingBean, DisposableBean {

    private String property;

    @Override
    public void afterPropertiesSet() throws Exception {
        // 在属性设置后执行的初始化逻辑
    }

    public void doSomething() {
        // Bean的业务逻辑
    }

    @Override
    public void destroy() throws Exception {
        // 在Bean销毁时执行的清理逻辑
    }
}

此外,Spring还提供了BeanFactoryPostProcessor 来进?扩展 。BeanFactoryPostProcessor 接?定义了?个?法 postProcessBeanFactory,?于在 Bean ??实例化 Bean 定义后对其进?修改。

//实现接口
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 在这里对BeanFactory进行定制和扩展
    }
}

<!-- 在配置文件中注册BeanFactoryPostProcessor -->
<bean class="com.example.CustomBeanFactoryPostProcessor"/>

//注册BeanFactoryPostProcessor
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 获取所有Bean的定义
        String[] beanNames = beanFactory.getBeanDefinitionNames();
        for (String beanName : beanNames) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
            // 下面对Bean的定义进行定制和扩展
           ........
        }
    }
}


总结

默认情况下,Bean生命周期分为五个阶段

阶段描述示例代码
实例化Bean的实例被创建<bean id="myBean" class="com.example.MyBean"/>
属性设置设置Bean的属性<property name="propertyName" value="propertyValue"/>
初始化执行初始化逻辑<bean id="myBean" class="com.example.MyBean" init-method="initMethod"/>
使用Bean被应用程序使用MyBean myBean = (MyBean) context.getBean("myBean");
销毁执行销毁逻辑<bean id="myBean" class="com.example.MyBean" destroy-method="destroyMethod"/>。

加上 Bean 的后置处理器后(Bean 的初始化前后被调?的postProcessBeforeInitialization 和postProcessAfterInitialization方法),实际是7个阶段。

文章来源:https://blog.csdn.net/weixin_47936134/article/details/135723584
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。