繁体   English   中英

如何在contextDestroyed中从ServletContextListener获取bean

[英]How to get bean from ServletContextListener in contextDestroyed

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

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 但是当我将其更改为

    private static ApplicationContext appContext; 

然后我可以看到我的appContext。 为什么呢 什么是获得豆类的正确选择

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

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

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

使它成为static类型的“解决方案”是因为它现在是类变量而不是实例变量。 现在所有实例共享该变量。

最好删除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托管实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM