/*
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.context.annotation;
import java.io.Closeable;
import java.io.IOException;
import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
/**
* @author Chris Beams
* @author Juergen Hoeller
* @author Stephane Nicoll
*/
public class DestroyMethodInferenceTests {
@Test
public void beanMethods() {
ConfigurableApplicationContext ctx =
new AnnotationConfigApplicationContext(Config.class);
WithExplicitDestroyMethod c0 = ctx.getBean(WithExplicitDestroyMethod.class);
WithLocalCloseMethod c1 = ctx.getBean("c1", WithLocalCloseMethod.class);
WithLocalCloseMethod c2 = ctx.getBean("c2", WithLocalCloseMethod.class);
WithInheritedCloseMethod c3 = ctx.getBean("c3", WithInheritedCloseMethod.class);
WithInheritedCloseMethod c4 = ctx.getBean("c4", WithInheritedCloseMethod.class);
WithInheritedCloseMethod c5 = ctx.getBean("c5", WithInheritedCloseMethod.class);
WithNoCloseMethod c6 = ctx.getBean("c6", WithNoCloseMethod.class);
WithLocalShutdownMethod c7 = ctx.getBean("c7", WithLocalShutdownMethod.class);
WithInheritedCloseMethod c8 = ctx.getBean("c8", WithInheritedCloseMethod.class);
assertThat(c0.closed, is(false));
assertThat(c1.closed, is(false));
assertThat(c2.closed, is(false));
assertThat(c3.closed, is(false));
assertThat(c4.closed, is(false));
assertThat(c5.closed, is(false));
assertThat(c6.closed, is(false));
assertThat(c7.closed, is(false));
assertThat(c8.closed, is(false));
ctx.close();
assertThat("c0", c0.closed, is(true));
assertThat("c1", c1.closed, is(true));
assertThat("c2", c2.closed, is(true));
assertThat("c3", c3.closed, is(true));
assertThat("c4", c4.closed, is(true));
assertThat("c5", c5.closed, is(true));
assertThat("c6", c6.closed, is(false));
assertThat("c7", c7.closed, is(true));
assertThat("c8", c8.closed, is(false));
}
@Test
public void xml() {
ConfigurableApplicationContext ctx = new GenericXmlApplicationContext(
getClass(), "DestroyMethodInferenceTests-context.xml");
WithLocalCloseMethod x1 = ctx.getBean("x1", WithLocalCloseMethod.class);
WithLocalCloseMethod x2 = ctx.getBean("x2", WithLocalCloseMethod.class);
WithLocalCloseMethod x3 = ctx.getBean("x3", WithLocalCloseMethod.class);
WithNoCloseMethod x4 = ctx.getBean("x4", WithNoCloseMethod.class);
WithInheritedCloseMethod x8 = ctx.getBean("x8", WithInheritedCloseMethod.class);
assertThat(x1.closed, is(false));
assertThat(x2.closed, is(false));
assertThat(x3.closed, is(false));
assertThat(x4.closed, is(false));
ctx.close();
assertThat(x1.closed, is(false));
assertThat(x2.closed, is(true));
assertThat(x3.closed, is(true));
assertThat(x4.closed, is(false));
assertThat(x8.closed, is(false));
}
@Configuration
static class Config {
@Bean(destroyMethod="explicitClose")
public WithExplicitDestroyMethod c0() {
return new WithExplicitDestroyMethod();
}
@Bean
public WithLocalCloseMethod c1() {
return new WithLocalCloseMethod();
}
@Bean
public Object c2() {
return new WithLocalCloseMethod();
}
@Bean
public WithInheritedCloseMethod c3() {
return new WithInheritedCloseMethod();
}
@Bean
public Closeable c4() {
return new WithInheritedCloseMethod();
}
@Bean(destroyMethod="other")
public WithInheritedCloseMethod c5() {
return new WithInheritedCloseMethod() {
@Override
public void close() throws IOException {
throw new RuntimeException("close() should not be called");
}
@SuppressWarnings("unused")
public void other() {
this.closed = true;
}
};
}
@Bean
public WithNoCloseMethod c6() {
return new WithNoCloseMethod();
}
@Bean
public WithLocalShutdownMethod c7() {
return new WithLocalShutdownMethod();
}
@Bean(destroyMethod = "")
public WithInheritedCloseMethod c8() {
return new WithInheritedCloseMethod();
}
}
static class WithExplicitDestroyMethod {
boolean closed = false;
public void explicitClose() {
closed = true;
}
}
static class WithLocalCloseMethod {
boolean closed = false;
public void close() {
closed = true;
}
}
static class WithInheritedCloseMethod implements Closeable {
boolean closed = false;
@Override
public void close() throws IOException {
closed = true;
}
}
static class WithNoCloseMethod {
boolean closed = false;
}
static class WithLocalShutdownMethod {
boolean closed = false;
public void shutdown() {
closed = true;
}
}
}