`
sfeve
  • 浏览: 42406 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

listener获取spring容器中的bean

阅读更多

需要实现一个功能: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;
}
 
1
0
分享到:
评论
3 楼 timer_yin 2012-05-02  
以前就是因为部署到linux,读取路径问题折腾了N天,终于弄出来了,是在前面加'/' 要是早点儿看到楼主的这个文章就好了
2 楼 sfeve 2011-07-11  
guoapeng 写道
为什么不另外写一个bean
将它配置在Spring里面,
而非写成一个Linstener不可吗?

呵呵,也可以吧。listener没用过,熟悉下啦
1 楼 guoapeng 2011-07-09  
为什么不另外写一个bean
将它配置在Spring里面,
而非写成一个Linstener不可吗?

相关推荐

    Spring中文帮助文档

    12.2.2. 在Spring容器中创建 SessionFactory 12.2.3. The HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的...

    IOC创建流程.xmind

    1. Spring容器会合适的时机创建这些Bean 1. 用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中; 2. 统一创建剩下所有的bean的时候;finishBeanFactoryInitialization(); 1. 后置处理器;...

    springweb3.0MVC注解(附实例)

    web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。annomvc-servlet.xml 的配置内容如下所示: ...

    Spring API

    12.2.2. 在Spring容器中创建 SessionFactory 12.2.3. The HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的...

    ssh(structs,spring,hibernate)框架中的上传下载

     此外lazy="true"说明地返回整个Tfile对象时,并不返回fileContent这个字段的数据,只有在显式调用tfile.getFileContent()方法时才真正从数据库中获取fileContent的数据。这是Hibernate3引入的新特性,对于包含重量...

    封装通用的Spring3+Struts2+MyBatis3的CRUD+条件分页查询,Spring+Quartz调度,FunctionCharts图像化工具

    &lt;bean id="temperMonitorTimerJob" class="cn.sup.cd.listener.TemperatureMonitorTaskJob"&gt;&lt;/bean&gt; &lt;!-- 政策调度--&gt; &lt;bean id="temperMonitorTask" class="org.springframework.scheduling.quartz....

    springboot学习思维笔记.xmind

    web项目设置在Servlet的context parameter中 事件Application Event 自定义事件,集成ApplicationEvent 定义事件监听器,实现ApplicationListener 使用容器发布事件 Spring高级话题 Spring Aware ...

    springboot知识点整理

    5 Spring Boot与Docker(虚拟化容器技术) 110 5.1 简介 110 5.2 核心概念 111 5.3 安装Docker 112 5.4 Docker常用命令&操作 113 5.5 安装MySQL示例 114 6 Spring Boot与数据访问 115 6.1 JDBC 115 6.1.1 实现 115 ...

    通俗易懂的Spring注解驱动开发教程(含配套资料)

    本教程为授权出品教程 ...监听器(ApplicationListener) 3).Spring容器启动过程; 3).web原理 1).Servlet3.0标准新增特性 2).异步请求相关 本视频使用了maven构建程序,需要同学们有对Spring.SpringMVC的基本

    SSH第7章上机.zip ACCP8.0

    -- 配置spring随web容器启动时就创建 --&gt; &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;/listener&gt; 在struts.xml中配置对象创建工具为spring ...

    JMS入门Demo

    在Spring整合JMS的应用中,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true,如: &lt;bean id="jmsContainer" class="org.springframework.jms....

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    FactoryInstance 的 lookup() 方法被调用,在 SpringFactoryInstance 中,首先查找 Spring 容器,然后,通过 Bean 的 ID 查找 Bean,最终,FlexService 接口的实例被返回。 注意到 destination 的 id 并没有写死在...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    FactoryInstance 的 lookup() 方法被调用,在 SpringFactoryInstance 中,首先查找 Spring 容器,然后,通过 Bean 的 ID 查找 Bean,最终,FlexService 接口的实例被返回。 注意到 destination 的 id 并没有写死在...

    java8源码-LearnSpring:学习springboot

    java8 源码 Learn Spring Bean 注解 Target 关联注解 所在模块 所在包 ...事务(Transactional) ...bean ...学习Spring的关键 ...注解就相当于在业务开发中的功能需求,重点是理解加上注解之后程序如何...容器初始化的工作。 sprin

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    8.7 在Session Bean中使用事务 327 8.7.1 容器管理事务 327 8.7.2 Bean管理事务 330 8.8 拦截器 332 8.9 依赖注入 335 8.9.1 EJB注入 336 8.9.2 资源注入 339 8.10 配置EJB引用 340 8.11 使用计时器进行任务调度 342...

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    使用Maven POM editor打开项目中的pom.xml文件,选择Dependencies,在Dependencies栏目点击Add进行,首先弹出一个搜索按钮,例如输入spring-web,就会自动搜索关于spring-web相关的jar包,我们选择3.0.5版本的spring...

    java面试题库2021.pdf

    ①IoC 与 Bean 配置、 管理 ②AOP 与事务、 权限控制 ③S2SH 整合开发 ④Spring, JPA 整合 2、 Hibernate ①ORM 与持久化映射 ②延迟加载、 性能优化 ③HQL 查询、 条件查询、 SQL 查询 ④二级缓存与查询缓存 3、 ...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics