在Spring项目中,我使用了ServletContextListener
的监听器类型。我使用了@Autowired
的实例字段,但是我无法在contextInitialized(event)
方法中使用自动装配的实例变量,它会抛出NullpointerException
。
如何使用@Autowired
来实现此目标
答案 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
。