如何从contextDestroyed中的ServletContextListener获取bean

时间:2016-01-05 09:49:35

标签: java spring servlets

我想在contextDestroyed中获取bean,所以我有这段代码。

<a data-toggle="collapse" href="#cpanel0758223" data-parent="#stuff.a">Load Data</a>

问题是它记录public class MyContextListener implements ApplicationContextAware, ServletContextListener { private final Logger logger = LogManager.getLogger(getClass()); private ApplicationContext appContext; @Override public void contextInitialized(ServletContextEvent event) { logger.warn("Start"); } @Override public void contextDestroyed(ServletContextEvent event) { logger.warn("End" + appContext); appContext.getBean("myBean") } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.appContext = applicationContext; } } 。但是当我把它改成

null

然后我可以看到我的appContext。为什么?什么是获取bean的正确选项

1 个答案:

答案 0 :(得分:0)

您有MyContextListener的2个实例。一个由Spring配置,一个由Web容器配置。

由Spring配置的那个将具有ApplicationContextAware回调并且设置了appContext属性,但是您的servlet容器不知道它并且因此不会参与生命周期回调

第二个实例是servlet容器中的一个实例,但由于它不受管理,因此它不会收到ApplicationContextAware的回调,因此appContext将会是null

让它成为static&#34;解决&#34;因为它现在是一个类变量而不是实例变量。现在所有实例都共享该变量。

最好删除ApplicationContextAware并在侦听器中使用WebApplicationContextUtils.getRequiredWebApplicationContext方法。

public class MyContextListener extends BaseTask implements ServletContextListener {

    private final Logger logger = LogManager.getLogger(getClass());

    @Override
    public void contextInitialized(ServletContextEvent event) {
        logger.warn("Start");
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        logger.warn("End" + appContext);
        WebApplicationContextUtils.getRequiredWebApplicationContext(event.getServletContext()).getBean("myBean");
    }

}

现在您只需要servlet容器的实例(web.xml或其他配置方法),您可以删除spring托管实例。