spring 07 Bean 的初始化与销毁
初始化销毁顺序
Spring 提供了多种初始化手段,除了课堂上讲的 @PostConstruct,@Bean(initMethod) 之外,还可以实现 InitializingBean 接口来进行初始化,如果同一个 bean 用了以上手段声明了 3 个初始化方法,那么它们的执行顺序是
- @PostConstruct 标注的初始化方法
- InitializingBean 接口的初始化方法
- @Bean(initMethod) 指定的初始化方法
而继承了 Awire 接口实现的注入方法执行时间在 @PostConstruct 与 InitializingBean 之间
点击查看代码
public class S07Bean1 implements InitializingBean {
public void init(){
System.out.println("@Bean init 初始化方法...");
}
@PostConstruct
public void aa() {
System.out.println("@PostConstruct 初始化方法...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean 初始化方法...");
}
}
@Bean(initMethod = "init")
public S07Bean1 s07Bean1(){
return new S07Bean1();
}
与初始化类似,Spring 也提供了多种销毁手段,执行顺序为
- @PreDestroy 标注的销毁方法
- DisposableBean 接口的销毁方法
- @Bean(destroyMethod) 指定的销毁方法
点击查看代码
public class S07Bean2 implements DisposableBean {
public void beanDestroy(){
System.out.println("@Bean destroy 销毁方法...");
}
@PreDestroy
public void bbb(){
System.out.println("@PreDestroy 销毁方法...");
}
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean 销毁方法...");
}
}
@Bean(destroyMethod = "beanDestroy")
public S07Bean2 s07Bean2(){
return new S07Bean2();
}
注意:
用 GenericApplicationContext 加载后处理器和单例 Bean 时记得 refresh 方法刷新,否则报错
单例 Bean 销毁后可以继续创建
点击查看代码
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition(
"myBean",
BeanDefinitionBuilder.genericBeanDefinition(MyBean.class)
.setDestroyMethodName("destroy") //相当于 @Bean 中指定销毁方法
.getBeanDefinition()
);
System.out.println(beanFactory.getBean(MyBean.class));
beanFactory.destroySingletons(); // 销毁之后, 仍可创建新的单例
System.out.println(beanFactory.getBean(MyBean.class));
}