Bean的销毁是发生成Spring容器关闭过程中的。比如
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//容器关闭
context.close();
单列Bean的销毁过程中执行了哪些方法?
如果Bean实现了DisposableBean接口,则执行其destory方法。
@Component
public class DestroyService implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean destroy test");
}
}
输出结果:DisposableBean destroy test
如果Bean实现了AutoCloseable接口,则执行其close方法。
@Component
public class DestroyService implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("AutoCloseable close test");
}
}
输出结果:AutoCloseable close test
如果Bean有@PreDestroy注解修饰的方法,则执行该方法,可以有多个。
@Component
public class DestroyService {
@PreDestroy
public void test1() {
System.out.println("@PreDestroy test 1");
}
@PreDestroy
public void test2() {
System.out.println("@PreDestroy test 2");
}
}
输出结果:
@PreDestroy test 1
@PreDestroy test 2
如果BeanDefinition中指定了销毁方法,则执行该方法。如果指定的销毁方法为"(inferred)",则执行close方法,如果close方法不存在,则会执行shutdown方法。
//借助BeanDefinition后置处理器指定销毁方法为test
@Component
public class MergedBeanDefinitionPostProcessorTest implements MergedBeanDefinitionPostProcessor {
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (beanName.equals("destroyService")) {
beanDefinition.setDestroyMethodName("test");
}
}
}
@Component
public class DestroyService {
public void test() {
System.out.println("BeanDefinition destroyMethod test");
}
}
输出结果:BeanDefinition destroyMethod test
//借助BeanDefinition后置处理器指定销毁方法为"(inferred)"
@Component
public class MergedBeanDefinitionPostProcessorTest implements MergedBeanDefinitionPostProcessor {
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (beanName.equals("destroyService")) {
beanDefinition.setDestroyMethodName("(inferred)");
}
}
}
@Component
public class DestroyService {
public void close() {
System.out.println("beanDefinition destroyMethod (inferred) close test");
}
public void shutdown() {
System.out.println("beanDefinition destroyMethod (inferred) shutdown test");
}
}
输出结果:beanDefinition destroyMethod (inferred) close test
@Component
public class DestroyService {
// public void close() {
// System.out.println("beanDefinition destroyMethod (inferred) close test");
// }
public void shutdown() {
System.out.println("beanDefinition destroyMethod (inferred) shutdown test");
}
}
输出结果:beanDefinition destroyMethod (inferred) shutdown test