关闭ApplicationContextInitializer的等效项

时间:2012-09-10 11:58:57

标签: java spring apache-zookeeper apache-curator

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

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

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

我是否也可以将CuratorFramework实例传递到上下文中,以便将其用作bean?

3 个答案:

答案 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 */
                }
            });
        }
    }