在ServletContextListener 的實現類中(使用Spring @Value 註解的方式讀取配置檔案、或者注入Spring bean)
阿新 • • 發佈:2018-12-05
在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