Spring Bean 的生命周期

作者 : admin 本文共3701个字,预计阅读时间需要10分钟 发布时间: 2024-06-10 共2人阅读

一、生命周期

  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 也会调用该方法。

二、代码实战

Spring Bean 的生命周期插图
MainApp

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>

代码输出结果
Spring Bean 的生命周期插图(1)

本站无任何商业行为
个人在线分享 » Spring Bean 的生命周期
E-->