Spring框架中Bean的生命周期

编程笔记: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个阶段。

  • 42
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值