【Springboot入门-Bean 的生命周期】

发布于:2024-10-13 ⋅ 阅读:(124) ⋅ 点赞:(0)

整体流程

  1. 实例化 Bean
    • Bean 的生命周期从实例化开始。Spring 容器使用 Bean 的构造器或相应的工厂方法创建 Bean 实例。
  2. 属性赋值
    • 在 Bean 实例化之后,Spring 容器将按照在配置文件中定义的属性值注入 Bean。
  3. BeanNameAware、BeanFactoryAware
    • 如果 Bean 实现了 BeanNameAware 或 BeanFactoryAware 接口,Spring 容器将调用它们的 setBeanName 或 setBeanFactory 方法。
  4. BeanPostProcessor 前处理
    • 在初始化方法调用之前,Spring 容器会调用 BeanPostProcessor 接口的 postProcessBeforeInitialization 方法。
  5. 初始化方法
    • 如果 Bean 实现了 InitializingBean 接口,Spring 容器将调用其 afterPropertiesSet 方法。此外,如果 Bean 定义了 init-method,该方法也将被调用。
  6. BeanPostProcessor 后处理
    • 在初始化方法调用之后,Spring 容器会调用 BeanPostProcessor 接口的 postProcessAfterInitialization 方法。
  7. DisposableBean
    • 当容器关闭时,如果 Bean 实现了 DisposableBean 接口,将调用其 destroy 方法。此外,如果 Bean 定义了 destroy-method,该方法也将被调用。
  8. 销毁
    • Bean 的生命周期结束时,将进行资源清理工作。

代码实例

MyBean.java

import org.springframework.beans.factory.*;
public class MyBean implements InitializingBean, DisposableBean, BeanFactoryAware, BeanNameAware {
    private String name;

    public MyBean() {
        System.out.println("1. 实例化 Bean");
    }

    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println("2. BeanFactoryAware");
    }

    public void setBeanName(String beanName) {
        System.out.println("3. BeanNameAware");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("4. 属性赋值");
    }

    public void afterPropertiesSet() {
        System.out.println("5. InitializingBean 接口初始化方法");
    }

    public void customInit() {
        System.out.println("6. 自定义初始化方法");
    }

    public void destroy() {
        System.out.println("7. DisposableBean 接口销毁方法");
    }

    public void customDestroy() {
        System.out.println("8. 自定义销毁方法");
    }
}

MyBeanPostProcessor.java

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("9. BeanPostProcessor");
        // 实现逻辑
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("10. BeanPostProcessor");
        // 实现逻辑
        return bean;
    }
}

BeanLifeCycleDemo.java

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanLifeCycleDemo {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        context.close();
    }
}

applicationContext.xml

放在resources下

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="com.example.demo.springboot.MyBean" init-method="customInit" destroy-method="customDestroy" id="myBean">
        <property name="name" value="myName" />
    </bean>
    <bean class="com.example.demo.springboot.MyBeanPostProcessor" ></bean>
</beans>

执行结果

17:17:37.787 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.example.demo.springboot.MyBeanPostProcessor#0'
17:17:37.808 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myBean'
1. 实例化 Bean
4. 属性赋值
3. BeanNameAware
2. BeanFactoryAware
9. BeanPostProcessor
5. InitializingBean 接口初始化方法
6. 自定义初始化方法
10. BeanPostProcessor
17:17:37.878 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@6574b225, started on Thu Sep 26 17:17:37 CST 2024
7. DisposableBean 接口销毁方法
8. 自定义销毁方法