InitializingBean与DisposableBean接口介绍

614 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

1、InitializingBean在对象加载完成后完成类的初始化

除了前文讲的采用**@PostConstruct注解来完成初始化**,也可以通过实现InitializingBean完成类的初始化

当一个类实现这个接口之后,Spring启动后,初始化Bean时,若该Bean实现InitialzingBean接口,会自动调用afterPropertiesSet() 方法,完成一些用户自定义的初始化操作

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

定义一个StudentBeanInit类实现InitializingBean接口。

public class StudentBeanInit implements InitializingBean {
 
    private Integer id;
 
    private String name;
 
    private Math math;
 
    // 这里进行优先调用初始化一些参数
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("this is bean init set Math data");
        Math math = new Student(id,name);
        this.math = math;
    }

}

当然在spring初始化bean的时候,也可以在配置文件中指定了init-method,如果同时实现了InitializingBean接口,那系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。

构造方法,@postConstruct注解,实现InitializingBean以及配置init-method,他们的顺序优先级:

构造方法 > postConstruct > InitializingBean#afterPropertiesSet > init-method方法。

2、DisposableBean销毁bean的时候回调

该接口的作用是:允许在容器销毁该bean的时候获得一次回调。DisposableBean接口也只规定了一个方法:destroy。

public interface DisposableBean {
    void destroy() throws Exception;
}

定义User实现DisposableBean接口:

public class User implements DisposableBean{

    private int id;

    private String name;

    @Override
    public void destroy() throws Exception {
            // TODO Auto-generated method stub
            System.out.println("destory ....");
    }
}

当然也可以通过XML配置文件中通过指定destroy-method属性来完成。

还可以通过 @Bean注解方式: 

首先要创建一个至少拥有两个方法的类TestBean,一个方法充当init method,另一个充当destroy method1;创建好了这个类,我们就可以使用@Bean注解的方式指定两个方法,以让他们生效。

建一个配置类,相当于我们的xml文件,@ComponentScan则是指定需要spring来扫描的包——当前bean所在包,相当于xml中的context:component-scan属性;而@Bean后边的initMethod和destroyMethod就是在声明这是一个baen的同时指定了init和destroy方法,方法名从功能实现上来说可以随意。

配置类ConfigTest如下:

@Configuration//申明配置类
@ComponentScan("springTest2")//指定扫描包路径
public class ConfigTest {
    @Bean(initMethod = "init", destroyMethod = "destroy")
    TestBean test() {
        return new TestBean();
    }
}

核心代码 @Bean(initMethod = "init", destroyMethod = "destroy") 指定initMethod和destroyMethod对应定义的方法即可。