初始化和销毁方法
2018-04-28 本文已影响19人
宿命99
@Bean(initMethod="init", destoryMethod="destroy")
实现接口 InitializingBean 初始化方法, DisposableBean 接口的销毁方法
使用 JSR-205 规范中的注解 @PostConstruct 指定初始化方法, @PreDestroy 指定销毁方法
BeanPostProcessor 接口, Bean 的后置处理器
postProcessBeforeInitialization:在任何初始化之前,此方法会运行在 initMethod 之前。postProcessAfterInitialization:在任何初始化之后,此方法会运行在 initMethod 之后 。
销毁方法
@Bean 方式已经在 @Bean 注解章中说过了
实现接口的方式
Student 类
public class Student implements InitializingBean, DisposableBean {
public Student() {
System.out.println(" 构造器方法............");
}
@Override
public void destroy() throws Exception {
System.out.println("销毁方法.................");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化方法...................");
}
}
配置类
@Configuration
public class InitAndDestroyMethod {
@Bean
public Student student() {
return new Student();
}
}
测试代码
@Test
public void test9() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(InitAndDestroyMethod.class);
Student bean = ctx.getBean(Student.class);
System.out.println(bean.getClass());
}
结果
初始化方法执行成功
没有执行销毁方法,是因为没有关闭容器,显示的调用一次关闭容器的方法
@Test
public void test9() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(InitAndDestroyMethod.class);
Student bean = ctx.getBean(Student.class);
System.out.println(bean.getClass());
((AnnotationConfigApplicationContext)ctx).close();
}
再看执行结果
销毁方法也成功执行
JSR 250 注解 @PostContruct 和 @PreDestroy
改造 Student 类,不实现接口
public class Student {
public Student() {
System.out.println("Student 构造器方法............");
}
@PreDestroy
public void destroy() throws Exception {
System.out.println("Student 销毁方法.................");
}
@PostConstruct
public void init() throws Exception {
System.out.println("Student 初始化方法...................");
}
}
配置类不做改动
测试代码不做改动
结果
执行成功
会执行标注了注解的初始化方法和销毁方法
BeanPostProcessor 接口
该接口有两个方法,都只是针对初始化的。
改造 Student 类
public class Student implements BeanPostProcessor {
public Student() {
System.out.println("Student 构造器方法............");
}
@PreDestroy
public void destroy() throws Exception {
System.out.println("Student 销毁方法.................");
}
@PostConstruct
public void init() throws Exception {
System.out.println("Student 初始化方法...................");
}
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println(" postProcessBeforeInitialization 在初始化方法执行之前 执行........................");
return o;
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println(" postProcessAfterInitialization 在初始化方法执行之后 执行........................");
return o;
}
}
配置类不做改动
测试代码不做改动
结果
成功执行