spring 07 Bean 的初始化与销毁

初始化销毁顺序
Spring 提供了多种初始化手段,除了课堂上讲的 @PostConstruct,@Bean(initMethod) 之外,还可以实现 InitializingBean 接口来进行初始化,如果同一个 bean 用了以上手段声明了 3 个初始化方法,那么它们的执行顺序是

  1. @PostConstruct 标注的初始化方法
  2. InitializingBean 接口的初始化方法
  3. @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 也提供了多种销毁手段,执行顺序为

  1. @PreDestroy 标注的销毁方法
  2. DisposableBean 接口的销毁方法
  3. @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));

    }
posted @ 2022-06-20 15:40  xy7112  阅读(74)  评论(0)    收藏  举报