
让我们对图中的每一个关键步骤进行详细说明。
容器首先通过反射调用Bean的构造函数来创建对象实例。此时只是一个空的对象,属性均为默认值。
相当于:MyBean bean = new MyBean();
容器解析Bean的依赖关系(通过 @Autowired, @Value, XML中的 <property> 等配置),并将所需的依赖(其他Bean、基本值、集合等)注入到对象的属性中
相当于:bean.setDependency(someOtherBean);
这是Spring框架中极其强大的扩展点。BeanPostProcessor是一个接口,容器中所有实现了它的Bean都会在每个其他Bean的初始化前后被调用。
postProcessBeforeInitialization():在初始化阶段开始之前(即下图第4步之前)执行。允许对Bean进行修改或包装。AbstractAutoProxyCreator)。postProcessAfterInitialization():在初始化阶段结束之后(即下图第4步之后)执行。此时Bean已初始化完毕,可以进行最终的修饰。这是Bean生命中最关键的配置阶段,按固定顺序执行以下步骤:
a. Aware接口注入 (4.1)
如果Bean实现了各种Aware接口,容器会回调相应的方法,将一些基础设施对象注入给Bean。
BeanNameAware:setBeanName(String name)(获取自身的Bean ID/name)BeanFactoryAware:setBeanFactory(BeanFactory beanFactory)(获取BeanFactory容器)ApplicationContextAware:setApplicationContext(ApplicationContext applicationContext)(获取ApplicationContext容器,功能最全)EnvironmentAware, ResourceLoaderAware 等。b. @PostConstruct 注解 (4.2)
容器会调用被@PostConstruct标注的方法。这是Java EE规范的标准注解,推荐使用,用于执行一些自定义的初始化逻辑。
c. InitializingBean 接口 (4.3)
如果Bean实现了InitializingBean接口,容器会调用其afterPropertiesSet()方法。效果与@PostConstruct类似,但这是Spring特有的接口,将代码与Spring API耦合,不推荐使用。
d. 自定义初始化方法 (4.4)
调用在Bean定义中通过@Bean(initMethod = "myInit")或XML中init-method="myInit"指定的自定义初始化方法。这是一种外部配置的初始化方式,无代码侵入性。
初始化顺序总结:
Aware接口->@PostConstruct->InitializingBean->自定义init-method。
此时,Bean已经完全创建、配置并初始化完毕,驻留在容器中(通常是单例池),等待应用程序的使用(例如被其他Bean依赖或通过context.getBean()获取)。
当容器被关闭时(例如调用ApplicationContext的close()方法),所有单例Bean会进入销毁阶段,执行顺序与初始化类似,但相反:
a. @PreDestroy 注解 (8.1)
容器会调用被@PreDestroy标注的方法。这是Java EE规范的标准注解,推荐使用,用于释放资源(如关闭连接、清理线程池)。
b. DisposableBean 接口 (8.2)
如果Bean实现了DisposableBean接口,容器会调用其destroy()方法。同样,不推荐使用,因为会将代码与Spring API耦合。
c. 自定义销毁方法 (8.3)
调用在Bean定义中通过@Bean(destroyMethod = "myDestroy")或XML中destroy-method="myDestroy"指定的自定义销毁方法。
重要提示:原型(prototype)作用域的Bean,容器只负责创建、配置和初始化(到第6步)。不会管理其销毁!生命周期到第6步就结束了,销毁逻辑需要由创建它的客户端自己负责调用。
@Component
public class ExampleBean implements ApplicationContextAware, InitializingBean, DisposableBean {
@Autowired
private AnotherBean anotherBean; // 依赖注入
public ExampleBean() {
System.out.println("1. 构造函数执行 - 实例化");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
System.out.println("4.1. Aware接口注入: 获取到ApplicationContext");
}
@PostConstruct
public void postConstruct() {
System.out.println("4.2. @PostConstruct方法执行");
}
@Override
public void afterPropertiesSet() {
System.out.println("4.3. InitializingBean的afterPropertiesSet()执行");
}
public void customInit() {
System.out.println("4.4. 自定义init-method执行");
}
@PreDestroy
public void preDestroy() {
System.out.println("8.1. @PreDestroy方法执行");
}
@Override
public void destroy() {
System.out.println("8.2. DisposableBean的destroy()执行");
}
public void customDestroy() {
System.out.println("8.3. 自定义destroy-method执行");
}
}
// 配置类
@Configuration
public class AppConfig {
@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
public ExampleBean exampleBean() {
return new ExampleBean();
}
}Spring Bean的生命周期是一个高度可定制的过程,其核心可以概括为:
Aware接口 -> @PostConstruct -> InitializingBean -> init-method,前后被BeanPostProcessor包裹。@PreDestroy -> DisposableBean -> destroy-method。而 BeanPostProcessor 是贯穿始终的最强大的扩展点,Spring自身的很多高级功能(如AOP、事务、异步等)都是通过它来实现的。理解这些阶段和扩展点,能够让你更深入地理解Spring的运作原理,并有能力解决更复杂的问题。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。