案例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
定义适当的驱逐舰方法。但是,我想知道是否还有其他方法可以继续。
有什么好的建议吗?
注意: Foo
,Bar
,Timer
,ScheduledJob
类是在外部定义的。因此,不可能明确定义内部破坏方法。作为假设,我只能修改MyConf1
和MyConf2
。
答案 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)
DisposableBean可以帮助您处理案例#1。