我想向ServletContextListener中經過Spring @value 的方法讀取 properties 配置文件信息,可是我開始的方法不行html
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:java
<listener> <listener-class>MyListener</listener-class> </listener>
SpringConfig.xml:web
<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.propertiesspring
username=zjl password=123
輸出:ide
Initialising listener... username:null password: null
實現這一點的正確方法是什麼?this
參考stackoverflowspa
在應用出加入 .net
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
以下:code
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 也是一樣的操做xml
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