Spring – 向ServletContextListener注入一个依赖项

我想注入一个依赖到一个ServletContextListener 。 但是,我的方法是行不通的。 我可以看到Spring正在调用我的setter方法,但稍后调用contextInitialized时,该属性为null

这是我的设置:

ServletContextListener:

 public class MyListener implements ServletContextListener{ private String prop; /* (non-Javadoc) * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) */ @Override public void contextInitialized(ServletContextEvent event) { System.out.println("Initialising listener..."); System.out.println(prop); } @Override public void contextDestroyed(ServletContextEvent event) { } public void setProp(String val) { System.out.println("set prop to " + prop); prop = val; } } 

web.xml :(这是文件中的最后一个监听器)

 <listener> <listener-class>MyListener</listener-class> </listener> 

applicationContext.xml中:

 <bean id="listener" class="MyListener"> <property name="prop" value="HELLO" /> </bean> 

输出:

 set prop to HELLO Initialising listener... null 

什么是实现这一目标的正确方法?

dogbane的答案(已被接受)有效,但由于bean实例化的方式,使得testing变得困难。 我赞成在这个问题中提出的方法:

 @Autowired private Properties props; @Override public void contextInitialized(ServletContextEvent sce) { WebApplicationContextUtils .getRequiredWebApplicationContext(sce.getServletContext()) .getAutowireCapableBeanFactory() .autowireBean(this); //Do something with props ... } 

我解决了这个通过删除监听bean和为我的属性创build一个新的bean。 然后,我在侦听器中使用以下代码来获取属性bean:

 @Override public void contextInitialized(ServletContextEvent event) { final WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); final Properties props = (Properties)springContext.getBean("myProps"); } 

正如之前所提到的,ServletContextListener是由服务器创build的,所以它不被springpipe理。

如果你希望得到ServletContext的通知,你可以实现这个接口:

 org.springframework.web.context.ServletContextAware 

你不能有spring这样做,正如已经指出,是由服务器创build的。 如果你需要传递params到你的监听器,你可以在你的web xml中定义它作为上下文参数

 <context-param> <param-name>parameterName</param-name> <param-value>parameterValue</param-value> </context-param> 

在Listener中,你可以像下面那样检索它。

  event.getServletContext().getInitParameter("parameterName") 

编辑1:

有关其他可能的解决scheme,请参阅以下链

如何注入依赖到HttpSessionListener,使用Spring?

ServletContextListener由服务器创build,而不是由Spring创build。

编辑:AFAIK,你不能实现你想要什么,你想在侦听器中设置实例variables的原因是什么?