2012-09-10 57 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你在初始化時創建的。