Java 5 Closeable and Java 7 AutoCloseable automatically detected as destroy methods

Also, @Bean destroy method inference not applying for DisposableBean implementers anymore (avoiding double destruction).

Issue: SPR-10034
This commit is contained in:
Juergen Hoeller
2012-11-26 22:05:29 +01:00
committed by unknown
parent 5cb1930550
commit 9c6aa3e43b
5 changed files with 111 additions and 43 deletions

View File

@@ -16,6 +16,7 @@
package org.springframework.beans.factory;
import java.io.Closeable;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.security.AccessControlContext;
@@ -1909,7 +1910,6 @@ public class DefaultListableBeanFactoryTests {
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return new TestBean();
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
@@ -1920,6 +1920,25 @@ public class DefaultListableBeanFactoryTests {
assertTrue("Destroy method invoked", BeanWithDisposableBean.closed);
}
@Test
public void testBeanPostProcessorWithWrappedObjectAndCloseable() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
RootBeanDefinition bd = new RootBeanDefinition(BeanWithCloseable.class);
lbf.registerBeanDefinition("test", bd);
lbf.addBeanPostProcessor(new BeanPostProcessor() {
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return new TestBean();
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
});
BeanWithDisposableBean.closed = false;
lbf.preInstantiateSingletons();
lbf.destroySingletons();
assertTrue("Destroy method invoked", BeanWithCloseable.closed);
}
@Test
public void testBeanPostProcessorWithWrappedObjectAndDestroyMethod() {
DefaultListableBeanFactory lbf = new DefaultListableBeanFactory();
@@ -1930,7 +1949,6 @@ public class DefaultListableBeanFactoryTests {
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return new TestBean();
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
@@ -2250,6 +2268,16 @@ public class DefaultListableBeanFactoryTests {
}
public static class BeanWithCloseable implements Closeable {
private static boolean closed;
public void close() {
closed = true;
}
}
public static class BeanWithDestroyMethod {
private static boolean closed;