4

如何彻底关闭ApplicationContextInitializer实现中使用的资源?

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

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

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

4

3 回答 3

4

在您的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 */
                }
            });
        }
    }

于 2019-07-25T10:58:26.463 回答
1

我会创建一个获取 spring 事件的 bean,并使用它来关闭 curator,

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

    public void destroy() {
          delegate.close();
    }  
}
于 2012-09-10T13:42:12.850 回答
1

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

您可以让您的初始化程序类实现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您在初始化时创建的方法。

于 2012-09-10T13:48:48.750 回答