【Spring】Bean 的生命周期


一、生命周期

  1. 实例化:Spring 创建 Bean 实例。
  2. 属性赋值:将配置文件中定义的属性值或注入的依赖赋值给 Bean 的属性。
  3. 初始化:
    1. 执行各种通知:如果 Bean 实现了 BeanNameAware、BeanFactoryAware 等接口,Spring 会调用相应的方法通知 Bean 名称和 Bean 工厂等信息。
    2. 执行前置处理方法:如果有 BeanPostProcessor,Spring 会调用其 postProcessBeforeInitialization 方法。
    3. 执行初始化方法:如果 Bean 实现了 InitializingBean 接口,Spring 会调用其 afterPropertiesSet 方法;如果配置了自定义初始化方法,Spring 也会调用该方法。
    4. 执行后置处理方法:如果有 BeanPostProcessor,Spring 会调用其 postProcessAfterInitialization 方法。
  4. 销毁:当 Bean 不再需要时,Spring 会进行销毁操作:
    • 如果 Bean 实现了 DisposableBean 接口,Spring 会调用其 destroy 方法。
    • 如果配置了自定义销毁方法,Spring 也会调用该方法。
  5. 销毁:当 Bean 不再需要时,Spring 会进行销毁操作:
    • 如果 Bean 实现了 DisposableBean 接口,Spring 会调用其 destroy 方法。
    • 如果配置了自定义销毁方法,Spring 也会调用该方法。

二、代码实战

image-20240610170947630MainApp

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


public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        OrderService orderService = (OrderService) context.getBean("orderService");
        System.out.println("使用 orderService " + orderService);
        ((ClassPathXmlApplicationContext) context).close();
    }
}

OrderService

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;


public class OrderService implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
    private String beanName;
    private BeanFactory beanFactory;
    private String config;

    public OrderService() {
        System.out.println("OrderService 实例化");
    }

    /**
     * 属性赋值,在实际项目中可以类比成使用 @Autowired 注解注入某个对象,使用 @Value 注解注入某个属性的值
     */
    public void setConfig(String config) {
        this.config = config;
        System.out.println("属性赋值:" + config);
    }

    /**
     * 执行各种名称-设置 Bean 的名称
     */
    @Override
    public void setBeanName(String name) {
        this.beanName = name;
        System.out.println("通知 Bean 名称:" + beanName);
    }

    /**
     * 执行各种名称-设置 Bean 的工厂
     */
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
        System.out.println("通知 Bean 工厂:" + beanFactory);
    }

    /**
     * 这个就是 bean 生命周期中的初始化方法
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("初始化方法,加载配置 " + config);
        // 模拟加载配置文件
        if ("orderConfig".equals(config)) {
            System.out.println("加载配置文件成功");
        } else {
            System.out.println("加载配置文件失败");
        }
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("销毁方法,资源释放");
    }

    public String getConfig() {
        return config;
    }
}

OrderServicePostProcessor

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



public class OrderServicePostProcessor implements BeanPostProcessor {
    /**
     * 初始化之前的前置处理方法
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof OrderService) {
            System.out.println("前置处理方法:" + beanName);
            // 记录日志
            System.out.println("准备初始化 OrderService");
        }

        return bean;
    }

    /**
     * 初始化之后的后置处理方法
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof OrderService) {
            System.out.println("后置处理方法:" + beanName);
            // 进行一些验证
            OrderService orderService = (OrderService) bean;
            if (orderService.getConfig() == null || !"orderConfig".equals(orderService.getConfig())) {
                System.out.println("配置为空,初始化失败");
                return null;
            } else {
                System.out.println("初始化成功");
            }
        }

        return bean;
    }
}

bean.xml

<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 id="orderService" class="cn.xiucai.beantest.ordertest.OrderService">
        <property name="config" value="orderConfig"/>
    </bean>

    <bean class="cn.xiucai.beantest.ordertest.OrderServicePostProcessor"/>
</beans>

代码输出结果

image-20240610171025910


文章作者: xiucai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xiucai !
  目录