【问题标题】:How use @Autowired instance variable use in ServletContextListener如何在 ServletContextListener 中使用 @Autowired 实例变量
【发布时间】:2016-09-30 08:56:01
【问题描述】:

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

如何使用@Autowired

【问题讨论】:

  • 您必须手动接线; Spring 不会创建您的 Java EE 服务器所做的侦听器。你如何创建你的ApplicationContext?看看this

标签: java spring


【解决方案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");
    }

}

或者更好的解决方案是感谢蜘蛛鲍里斯

public class MyListener implements ServletContextListener {

    @Autowired
    private MyBean myBean;    

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

}

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2012-03-28
      • 2019-08-23
      相关资源
      最近更新 更多