Spring @PreDestroy和@PostConstruct注释

时间:2011-12-20 14:28:14

标签: spring singleton

我正在尝试在spring单例bean中启动和停止石英调度程序。但是postconstruct被调用了两次而且predestroy根本没有被调用。 This链接表示由于代理它自然被调用两次但这在postconstruct方法中导致异常。我只想在加载单例bean之后调用一次postConstruct。

2 个答案:

答案 0 :(得分:0)

为什么不尝试使用init-method或尝试实现初始化bean。这些为postConstruct提供了替代方法。

当卸载spring bean时,即当关闭容器或通过其他方式调用ConfigurableApplicationContext方法中的close()方法时,将调用preDestroy。

答案 1 :(得分:0)

我编写了一个contextloader监听器并更改了web.xml监听器。所以我只能初始化bean一次。

 <listener>
        <listener-class>
              CustomContextLoaderListener
        </listener-class>
    </listener>

public class CustomContextLoaderListener  extends  
                        org.springframework.web.context.ContextLoaderListener{
     Scheduler scheduler;

    @Override
     public void contextInitialized(javax.servlet.ServletContextEvent event) {
             try{
             super.contextInitialized(event);
             this.scheduler= WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()).getBean(Scheduler.class);

    }

    @Override
    public void contextDestroyed(ServletContextEvent event){

          super.contextDestroyed(event);
          scheduler.stopSchedulers();


    }