`
sfeve
  • 浏览: 43824 次
  • 性别: 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运行过程中动态注册bean

    在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的Bean定义。这种能力在很多场景下都是极其有用的,比如根据不同的环境配置加载不同的服务实现,或者在运行时根据某些...

    Spring中Bean的生命周期 applicationcontext的应用(实现国际化,事件的传递)

    5. **销毁回调**:当Spring容器关闭时,或Bean定义中设置了`destroy-method`,Spring会调用Bean的销毁方法。同样,实现`DisposableBean`接口的Bean会调用`destroy()`方法。 接下来,我们看看ApplicationContext的...

    详解Spring中bean的作用域

    如果你使用的是 Servlet 2.4 及以上的 web 容器,那么你仅需要在 web 应用的 XML 声明文件 web.xml 中增加下述 ContextListener 即可:&lt;web-app&gt;...&lt;listener&gt;&lt;listener-class&gt;org.springframework.web.context....

    Spring启动后获取所有拥有特定注解的Bean实例代码

    首先,通过实现ApplicationListener接口,可以在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象。ApplicationListener是一个事件监听器接口,用于监听Spring容器中的事件。ContextRefreshedEvent是一个...

    spring 中特殊bean用法

    在Spring框架中,Bean是核心概念,它代表了应用程序中的对象,这些对象由Spring容器管理其生命周期和依赖关系。特殊Bean用法主要涉及Spring提供的多种高级特性,包括但不限于工厂方法、 prototype scope、AOP代理、...

    spring容器学习笔记

    初始化和销毁方法在 Spring 容器中,我们可以通过配置来指定 Bean 在被创建后或销毁前需要执行的方法。这些方法可以用于执行初始化设置或者清理工作。 3.1. 初始化方法当我们想要在 Bean 创建完成后执行特定的初始...

    详解Spring中bean的scope以后使用

    当一个Bean被定义为Singleton时,Spring容器只会为这个Bean创建一个实例,并将其保存在单例缓存中。这意味着每当需要这个Bean时,Spring都会返回同一个实例。这有助于减少内存消耗和提高性能,尤其是在处理复杂的...

    spring技术详解

    Spring技术详解 Spring技术详解是Java框架中的一种重要技术,主要用于解决Java应用程序...Spring容器和被管理的Bean是Spring技术的核心组成部分,ApplicationContext是BeanFactory的子接口,用于管理Spring中的Bean。

    Spring通过ApplicationContext主动获取bean的方法讲解

    Spring通过ApplicationContext主动获取bean的...通过使用ApplicationContext,我们可以轻松地获取到Spring容器中的bean,并且可以根据需要来获取不同的bean。这个方法可以帮助我们更好地管理和使用Spring容器中的bean。

    特殊情况(ActionForm,Servlet, Filter, Listener)下Spring如何注入对象

    在Spring框架中,依赖注入(Dependency Injection,DI)是一种核心特性,它允许对象之间的依赖关系在运行时由Spring容器管理,而不是由代码直接创建。在SSH(Struts、Hibernate、Spring)整合的Web应用中,Spring的...

    Spring3.1.3 Ioc在Web容器中的建立

    控制反转(IoC)是一种设计模式,它将对象的创建和管理权从代码中分离出来,交由Spring容器来处理。这样做的好处是提高了代码的可测试性、模块化和灵活性。依赖注入(DI)是IoC的一种实现方式,通过容器将对象需要的...

    spring源码中英文注释

    Spring框架是Java开发中不可或缺的一部分,它以其模块化、易用性和灵活性著称。这个压缩包文件中的"spring源码 中英文注释"为开发者提供了一个深入理解Spring框架内部工作原理的机会。通过阅读源码和注释,我们可以...

    web容器中实例化spring相关配置解析

    这个文件中定义了Spring容器的配置信息,包括Bean的定义、数据源的配置、事务管理等。 如果需要加载多个配置文件,可以使用逗号分隔的方式来指定多个文件。例如: &lt;param-name&gt;contextConfigLocation ...

    Spring的IoC容器

    4. **获取Bean**:使用`getBean()`方法从容器中获取Bean实例,进行业务操作。 5. **依赖注入**:容器自动处理Bean之间的依赖关系,无需在代码中显式创建或查找依赖对象。 ### 5. 进阶使用 - **AOP代理**:IoC容器...

    SpringBoot整合Listener的两种方式.docx

    在Spring Boot应用中,整合Listener主要是为了监听应用的生命周期事件,例如在应用启动或关闭时执行特定的操作。这里我们讨论两种整合Listener的方式。 ### 方式一:通过注解扫描完成Listener组件的注册 1. **创建...

    spring容器的触发事件 ClassPathXmlApplicationContext的start()方法的用法

    该配置文件定义了一个名为 `ApplicationEventListener` 的 Bean,类型为 `ioc.test.ApplicationEventListener`,当 Spring 容器启动时会自动实例化这个 Bean。 #### 六、事件监听器实现 ```java package ioc.test;...

    Spring 3 Reference中文

    另外,还可以通过实现特定的aware接口,来让bean获取Spring容器的信息。 4.7 Bean定义的继承 Spring允许bean定义之间继承,这样子bean定义可以覆盖父定义的属性值。 4.8 容器扩展点 Spring IoC容器提供了许多扩展...

    webservice7 spring的bean发布为webservice

    为了确保Web应用能够成功运行,并且能够将Spring中的Bean发布为WebService,我们需要做一些前期准备: 1. **安装Tomcat服务器**:作为部署应用的基本环境。 2. **下载并安装Spring框架**:Spring框架提供了一个强大...

    Spring在容器在启动的时候发生了什么

    在Spring框架中,当一个基于Servlet的Web应用启动时,Spring容器的初始化过程是至关重要的。这个过程涉及到多个组件和步骤,让我们详细探讨一下。 首先,我们在`web.xml`配置文件中看到了`&lt;context-param&gt;`和`...

Global site tag (gtag.js) - Google Analytics