Spring组件生命周期(二)

心不动则不痛 提交于 2020-02-08 18:38:18

@Bean指定初始化和销毁方法

@Bean中有initMethod和destroyMethod两个参数

  • initMethod:初始化方法
  • destroyMethod:销毁方法

使用

在Bean中写初始化方法、销毁方法

public class Person {
 	private void init(){
        //初始化代码
        System.out.println("init execute");
    }
    private void destroy(){
        //销毁代码
        System.out.println("destroy execute");
    }
}

在@Bean中指定

@Configuration
public class ApplicationConfig {

    /*
    默认name是获取Bean的方法名  person
    @Bean("person001") 这样使用注解  name则为person001
     */
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Person person() {
        return new Person("小符", 18);
    }

}

初始化容器

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    }
}

在这里插入图片描述
可以看到初始化方法被执行了,那销毁方法呢?
加入容器关闭代码再次看输出内容

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        context.close();
    }
}

在这里插入图片描述
可以看到销毁方法也被执行了。

这里需要注意的是
1.默认单例Bean情况下,是容器初始化就回执行初始化方法,如果使用了@Lazy或者@Scope(“prototype”)初始化容器时Bean的初始化方法不会执行。
2.如果使用@Scope(“prototype”),容器close时不会执行Bean的destroy。需要自己手动调用destroy方法销毁。

@PostConstruct和@PreDestroy

@PostConstruct:使用了该注解的方式表示为初始化方法
@PreDestroy:容器删除实例时会通知回调该销毁方法

@PostConstruct和@PreDestroy和执行顺序都优先于上方所介绍的@Bean指定initMethod和destroyMethod。

使用

在Bean的初始化和销毁方法上加上对应注解

public class Person {
 	 @PostConstruct
    private void init(){
        //初始化代码
        System.out.println("init execute");
    }
    @PreDestroy
    private void destroy(){
        //销毁代码
        System.out.println("destroy execute");
    }
}

执行查看输出内容

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        context.close();
    }
}

在这里插入图片描述

InitializingBean和DisposableBean

InitializingBean:
接口中有afterPropertiesSet方法,此方法允许Bean实例对其整体执行验证设置所有bean属性后进行配置和最终初始化。设置bean所有属性后执行。
DisposableBean:
接口中有destroy方法,销毁对象时调用。

使用

在Bean中实现InitializingBean和DisposableBean接口

public class Person  implements InitializingBean, DisposableBean {
    //销毁对象时调用
    public void destroy() throws Exception {
        System.out.println("InitializingBean");
    }
    /*
    此方法允许Bean实例对其整体执行验证设置所有bean属性后进行配置和最终初始化。
     */
    // 设置bean所有属性后执行
    public void afterPropertiesSet() throws Exception {
        System.out.println("DisposableBean");
    }
}

查看输出

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        context.close();
    }
}

在这里插入图片描述

执行先后顺序

当三者都是用的情况下执行先后顺序
在这里插入图片描述
优先级:
@PostConstruct、@PreDestroy > InitializingBean、DisposableBean > @Bean(initMethod,destroyMethod)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!