我想将依赖项注入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
实现这一目标的正确方法是什么?
答案 0 :(得分:30)
dogbane的答案(已接受)有效但由于bean实例化的方式使测试变得困难。我更喜欢这个question中建议的方法:
@Autowired private Properties props;
@Override
public void contextInitialized(ServletContextEvent sce) {
WebApplicationContextUtils
.getRequiredWebApplicationContext(sce.getServletContext())
.getAutowireCapableBeanFactory()
.autowireBean(this);
//Do something with props
...
}
答案 1 :(得分:17)
我通过删除监听器bean并为我的属性创建一个新bean来解决这个问题。然后我在我的监听器中使用以下内容来获取属性bean:
@Override
public void contextInitialized(ServletContextEvent event) {
final WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
final Properties props = (Properties)springContext.getBean("myProps");
}
答案 2 :(得分:5)
如前所述,ServletContextListener是由服务器创建的,所以它不受spring管理。
如果您希望收到ServletContext的通知,可以实现界面:
org.springframework.web.context.ServletContextAware
答案 3 :(得分:1)
你已经无法做到这一点,正如已经说明的那样是由服务器创建的。 如果您需要将params传递给您的侦听器,您可以在web xml中将其定义为context-param
<context-param>
<param-name>parameterName</param-name>
<param-value>parameterValue</param-value>
</context-param>
在监听器中,您可以像下面一样检索它;
event.getServletContext().getInitParameter("parameterName")
修改1:
请参阅以下链接,了解其他可能的解决方案:
How to inject dependencies into HttpSessionListener, using Spring?