Spring Bean 生命周期
TIP
了解 Bean 的生命周期有助于在合适的时机做合适的初始化或销毁工作。
生命周期流程
实例化 → 属性赋值 → 初始化前置 → 初始化 → 初始化后置 → 就绪 → 销毁完整生命周期
java
@Component
public class MyBean implements InitializingBean, DisposableBean {
public MyBean() {
System.out.println("1. 实例化");
}
@Autowired
public void setDependency(Dependency dep) {
System.out.println("2. 属性赋值");
}
@PostConstruct
public void postConstruct() {
System.out.println("3. @PostConstruct 初始化");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("4. InitializingBean.afterPropertiesSet()");
}
@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
public void customInit() {
System.out.println("5. @Bean initMethod 初始化");
}
@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
public void customDestroy() {
System.out.println("6. @Bean destroyMethod 销毁");
}
@PreDestroy
public void preDestroy() {
System.out.println("7. @PreDestroy 销毁前");
}
@Override
public void destroy() throws Exception {
System.out.println("8. DisposableBean.destroy()");
}
}BeanPostProcessor
可以在 Bean 初始化前后统一处理:
java
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
if (bean instanceof MyBean) {
System.out.println("初始化前置处理: " + beanName);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof MyBean) {
System.out.println("初始化后置处理: " + beanName);
}
return bean;
}
}TIP
实际开发中常用 @PostConstruct 做初始化,@PreDestroy 做资源释放,避免实现 InitializingBean 等 Spring 接口以保持代码低耦合。