需要实现一个功能:web容器启动的时候需要加载一个listener,去把以前开启的调度重新启动起来。这个listener需要与数据库交互,但配置数据库连接和service的bean都在spring配置文件里配置,在context-param里加载。
listener加载先于context-param这个知道,但是context-param配的配置文件经测试是后加载于listener的。
最后综合各种资料,找到一种解决办法,如下。
web.xml里做如下配置:
<!-- 配置文件参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<!-- 自己的listener -->
<listener>
<listener-class>futureemail.core.FixTimeListener</listener-class>
</listener>
FixTimeListener.java如下:
public class FixTimeListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("listener run...");
String relativePath = event.getServletContext().getInitParameter(
"contextConfigLocation");
String realPath = event.getServletContext().getRealPath(relativePath);
SpringBeanFactory.init(realPath);
futureEmailService = (FutureEmailService) SpringBeanFactory
.getBean("futureEmailService"); //即可取到bean
// ....下面逻辑省略
}
@Override
public void contextDestroyed(ServletContextEvent e) {
SpringBeanFactory.clear();
}
}
SpringBeanFactory.java如下:
public class SpringBeanFactory {
private static ApplicationContext context;
/**
* 在应用程序启动时配置spring框架
*
* @param filePath
*/
public static void init(String filePath) {
if (context == null) {
context = new FileSystemXmlApplicationContext(filePath);
}
}
public static ApplicationContext getContext() {
return context;
}
/**
* 方法用于获取bean
*
* @param name
* @return
*/
public static Object getBean(String name) {
return context.getBean(name);
}
/**
* 在应用程序关闭时,清空spring框架配置信息
*/
public static void clear() {
if (context != null) {
context = null;
}
}
}
就是这样。
PS:部署到linux后可能会有一个问题。就是context = new FileSystemXmlApplicationContext(filePath)这里,filePath与windows下不同,会被默认成相对路径。
解决方法是:在filePath前再加一个/。代码如下:
if (filePath != null && filePath.startsWith("/")) {
filePath = "/" + filePath;
}