在ServletContextListener 的实现类中 使用Spring @Value 注解的方式读取配置文件
我想向ServletContextListener中通过Spring @value 的方法读取 properties 配置文件信息,但是我开始的方法不行
public class MyListener implements ServletContextListener{
@Value("${username}")
private String username;
@Value("${password}")
private String password;
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("Initialising listener...");
System.out.println("username:" + username + "password:" + password);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
}
}
web.xml:
<listener>
<listener-class>MyListener</listener-class>
</listener>
SpringConfig.xml:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>classpath:my.properties</value>
</list>
</property>
</bean>
my.properties
username=zjl
password=123
输出:
Initialising listener...
username:null password: null
实现这一点的正确方法是什么?
在应用出加入
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
如下:
public class MyListener implements ServletContextListener{
@Value("${username}")
private String username;
@Value("${password}")
private String password;
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("Initialising listener...");
// 加入下面的这行代码
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
System.out.println("username:" + username + "password:" + password);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
}
}
在ServletContextListener 的实现类中注入Spring bean 也是同样的操作
Spring – 将依赖项注入到ServletContextListener中
public class MyServletListener implements ServletContextListener, HttpSessionAttributeListener, HttpSessionListener {
@Autowired
private SomeService someService;
@Autowired
private AnotherService anotherService;
public void contextInitialized(ServletContextEvent sce) {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
...
}
参考来自:https://codeday.me/bug/20180205/128995.html
https://stackoverflow.com/questions/5511152/dependency-inject-servlet-listener