如何干净地关闭ApplicationContextInitializer
实施中使用的资源?
我创建了一个ApplicationContextInitializer
实现,它使用Curator项目连接到Zookeeper并获取属性文件。然后,它会创建一个Properties
实例,PropertiesPropertySource
并将其添加到上下文中。
当应用程序关闭时,我希望能够在作为初始化程序成员的close()
实例上调用CuratorFramework
。这怎么做得最好?
我是否也可以将CuratorFramework
实例传递到上下文中,以便将其用作bean?
答案 0 :(得分:1)
我会创建一个获取spring事件的bean,并使用它来关闭策展人,
public class CuratorDisposer implements DisposableBean {
private CuratorFramework delegate; //set through spring somehow
public void destroy() {
delegate.close();
}
}
答案 1 :(得分:1)
当应用程序关闭时,我希望能够调用close() 在CuratorFramework实例上,它是我的初始化程序的成员。 这怎么做得最好?
您可以让初始化类实现ApplicationListener
,然后将自身注册为上下文中的侦听器。然后,当上下文关闭时,您将收到ContextClosedEvent
。
我是否也可以将
CuratorFramework
实例传递到上下文中,以便将其用作bean?
您可以在初始化程序中执行类似的操作(未经测试):
RootBeanDefinition cfDef = new RootBeanDefinition(MethodInvokingFactoryBean.class);
cfDef.getPropertyValues().add("targetClass", MyInitializer.class);
cfDef.getPropertyValues().add("targetObject", this);
cfDef.getPropertyValues().add("targetMethod", "getCuratorFramework");
((BeanDefinitionRegistry)ctx).registerBeanDefinition("curatorFramework", cfDef);
并在初始化程序类中添加getCuratorFramework()
方法,返回您在初始化时创建的CuratorFramework
。
答案 2 :(得分:0)
在您的ApplicationContextInitializer
中,您可以添加一个ApplicationListener<ContextClosedEvent>
:
class MyContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.addApplicationListener(new ApplicationListener<ContextClosedEvent>() {
@Override
public void onApplicationEvent(ContextClosedEvent event) {
/* Cleanup code */
}
});
}
}