如何在ServletContextListener中使用@Autowired实例变量

时间:2016-09-30 08:56:01

标签: java spring

在Spring项目中,我使用了ServletContextListener的监听器类型。我使用了@Autowired的实例字段,但是我无法在contextInitialized(event)方法中使用自动装配的实例变量,它会抛出NullpointerException

如何使用@Autowired来实现此目标

2 个答案:

答案 0 :(得分:1)

你不能。 @Autowired仅在初始化上下文后才起作用。

所以你可以做这个黑客:

public class MyListener implements ServletContextListener {

    private MyBean myBean;    

    @Override
    public void contextInitialized(ServletContextEvent event) {
        WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
        this.myBean = (MyBean)ctx.getBean("myBean");
    }

}

或更好的解决方案将是 Boris the Spider

public class MyListener implements ServletContextListener {

    @Autowired
    private MyBean myBean;    

    @Override
    public void contextInitialized(ServletContextEvent event) {
        WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
        ctx.autowireBean(this);
    }

}

答案 1 :(得分:0)

嗯,Spring保证在上下文初始化之后它会被初始化。

在初始化之后,您可以使用以下方式访问它:

MyClass myClass = ctx.getBean(MyClass.class);

换句话说:您不能使用@Autowired签订合同,这将迫使Spring在应用程序上下文最终初始化之前初始化您的Bean