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的原因是什么?