如何正确销毁Spring配置类

时间:2017-06-24 09:45:20

标签: java spring inversion-of-control

案例1

让我们考虑以下Spring配置:

@Configuration
public class MyConf1 {

    @Bean
    public Foo getFoo() {
        // Foo class is defined as part of an external lib.
        return new Foo();
    }

    @Bean
    public Bar getBar() {
        return new Bar(getFoo());
    } 

 }

出于某些原因,我需要在Foo被销毁时调用myFoo.shutdown();的方法(即MyConf1)。 有没有办法在不从应用程序上下文直接检索bean实例的情况下执行此操作(通过ApplicationContext.getBean())?

案例2

再次,让我们考虑第二个Spring配置类:

@Configuration
public class MyConf2 {

    @Bean
    public ScheduledJob scheduledJob() {
        Timer jobTimer = new Timer(true);
        return new ScheduledJob(jobTimer);
    }

 }

这一次,我需要在销毁jobTimer.cancel()之前调用MyConf2。实际上,我可以在jobTimer之外实例化scheduledJob(),或者将其作为方法的参数,scheduledJob(Timer jobTimer)。 然后可以为MyConf2定义适当的驱逐舰方法。但是,我想知道是否还有其他方法可以继续。

有什么好的建议吗?

注意: FooBarTimerScheduledJob类是在外部定义的。因此,不可能明确定义内部破坏方法。作为假设,我只能修改MyConf1MyConf2

3 个答案:

答案 0 :(得分:3)

我建议在source yourpath/shlib/util.sh var1="hello" var2="world" echo "Defaults: Var1(a)-$var1 Var2(b)-$var2" changevars var1 var2 echo "$var1 $var2" 类中定义destroy()方法(注明@PreDestroy

同样,修改Foo类,如

ScheduledJob

public class ScheduledJob { private Timer timer; public ScheduledJob(Timer timer){ this.timer = timer; } @PreDestroy public void destroy(){ timer.cancel(); } }

中添加destroyMethod param
@Bean

答案 1 :(得分:0)

你可以实现DestructionAwareBeanPostProcessor接口,当bean被销毁时,它可以添加一个破坏前的回调。在该接口中,方法postProcessBeforeDestruction就是这样做,请参阅以下内容:

@Override
public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
    System.out.println("before destory:"+bean);
}

@Override
public boolean requiresDestruction(Object bean) {
    return true;
}

注意方法requiresDestruction应返回true,否则方法postProcessBeforeDestruction将不会在bean销毁时调用。

我有一个测试:

public static void main(String[] args){
    ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:application-main.xml");
    applicationContext.registerShutdownHook();
}

当bean被销毁时,postProcessBeforeDestruction真正调用。输出为:

before destory:com.zhuyiren.spring.learn.util.Handler@55141def
before destory:com.zhuyiren.spring.learn.controller.TestControleler@47eaca72
before destory:com.zhuyiren.spring.learn.service.impl.TestServiceImpl@7b2bbc3
before destory:com.zhuyiren.spring.learn.service.impl.TwoServiceImpl@48f2bd5b
before destory:com.zhuyiren.spring.learn.controller.ConverConroller@72967906
before destory:org.springframework.context.event.DefaultEventListenerFactory@1a482e36
before destory:org.springframework.context.event.EventListenerMethodProcessor@77fbd92c

答案 2 :(得分:-1)

请参阅以下页面http://forum.spring.io/forum/spring-projects/container/48426-postconstruct-and-predestroy-in-javaconfig

DisposableBean可以帮助您处理案例#1。