上篇文章介绍了,可以通过@Bean注解来指定bean创建和销毁方法,init-method和destory-method:
Bean生命周期(1)---Spring源码从入门到精通(七)
这篇主要介绍,InitializingBean, DisposableBean接口 和 @PostConstruct,@PreDestroy注解来实现bean生命周期创建和销毁方法的调用。
1、InitializingBean, DisposableBean
先定义Dog类,实现这两个接口,重写destroy销毁方法,此方法在容器关闭时候调用,重写afterPropertiesSet方法,此方法在容器创建时候调用,意思就是属性设置好之后调用,给Dog类加上前面文章介绍过的@Compoment注解,之后再在config类加上@ComponentScan注解指定扫描的包目录,代码如下:
@Component
public class Dog implements InitializingBean, DisposableBean {
public Dog(){
System.out.println("Dog... construct");
}
/**
* 销毁方法
* @throws Exception
*/
public void destroy() throws Exception {
System.out.println("Dog... destory");
}
/**
* 初始化方法
* @throws Exception
*/
public void afterPropertiesSet() throws Exception {
System.out.println("Dog afterPropertiesSet ...");
}
}
@Configuration
@ComponentScan("com.alibaba.bean")
public class ConfigLifeCycle {
//@Scope("prototype")
@Bean(initMethod = "init", destroyMethod = "destory")
public Car car(){
return new Car();
}
}
junitTest代码和上篇文章一样,不变,为了方便理解,我也重新贴一下:
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
ConfigLifeCycle.class);
System.out.println("容器创建完毕");
//多实例情况下,需要获取组件,才会初始化,并且不会销毁
//Object carObject = annotationConfigApplicationContext.getBean("car");
//getDefinitionNames(annotationConfigApplicationContext);
annotationConfigApplicationContext.close();
}
这时候,我们会打印出来,对象创建construct,初始化init和销毁:
2、@PostConstruct,@PreDestroy
定义cat类,给init和destory方法加这两个注解,顾名思义,PostConstruct注解意思在对象创建之后调用的方法,PreDestroy在销毁之前调用的方法,同样加上component注解,方便一会扫描,代码如下:
@Component
public class Cat {
public Cat(){
System.out.println("Cat...construct");
}
/**
* construct 构造函数创建对象之后执行
*/
@PostConstruct
public void init(){
System.out.println("cat ...PostConstruct.");
}
/**
* 销毁之前调用
*/
@PreDestroy
public void destory(){
System.out.println("cat ...PreDestroy");
}
}
junitTest不变,打印之后如下,正常调用destory和init方法: