2012-09-10 20 views
2

如何干净关闭ApplicationContextInitializer实施中使用的资源?ApplicationContextInitializer的关闭等效

我创建了一个使用Curator项目连接到Zookeeper并获取属性文件的ApplicationContextInitializer实现。然后它创建一个Properties实例,一个PropertiesPropertySource并将其添加到上下文中。

当应用程序关闭时,我希望能够在我的初始化程序的成员CuratorFramework实例上调用close()。这最好的做法是什么?

难道我还可以将CuratorFramework实例转换成的上下文,所以我可以将它用作bean吗?

+0

@sbridges:感谢您添加标签! –

回答

1

我会创建一个bean是可以获得的春季活动,并用它来关闭馆长,

public class CuratorDisposer implements DisposableBean { 
    private CuratorFramework delegate; //set through spring somehow 

    public void destroy() { 
      delegate.close(); 
    } 
} 
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你在初始化时创建的。