listener获取spring容器中的bean

5 篇文章 0 订阅
1 篇文章 0 订阅

需要实现一个功能: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;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值