`
wxinpeng
  • 浏览: 588511 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

Listener中取Spring容器中Bean的实例

 
阅读更多

在SSH项目开发中,会使用到监听器Listener,并且有时需要在监听器中完成数据库的操作等动作,此时需要在Listener中使用到Spring容器中的Bean。Spring容器本身就是在web.xml中使用listener的方式启动的。想在例如HttpSessionListener中使用依赖注入的方式完成Bean实例的注入,不能完成。

 

一种解决方案:在HttpSessionListener中通过new的方式得到Spring容器的实例。如下代码:

 

//通过new的方式得到Spring容器的实例
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

 

 结果是:可以取得Spring的容器,但是是重新生成了一个新的Spring的容器。SSH项目启动的时候已经自动生成了一个Spring的容器,这样就存在了两个Spring的容器。不可取。

 

最好的解决方案:通过Spring提供的WebApplicationContextUtils 得到Spring容器的实例。代码如下:

 

 

public class MySessionListener implements HttpSessionListener {
	private Logger logger=Logger.getLogger(MySessionListener.class);
	
	@Override
	public void sessionCreated(HttpSessionEvent event) {
		logger.debug("新的session的产生!!");
		HttpSession session=event.getSession();
		session.setAttribute(InitUtil.ISNEWSESSION, "true");
		//通过抽象的私有方法得到Spring容器中Bean的实例。
		UsersDao userDao=(UsersDao)this.getObjectFromApplication(session.getServletContext(), "usersDaoHibernate");
		System.out.println("取得的Dao的实例="+userDao);
		
	}
	/**
	 * 通过WebApplicationContextUtils 得到Spring容器的实例。根据bean的名称返回bean的实例。
	 * @param servletContext  :ServletContext上下文。
	 * @param beanName  :要取得的Spring容器中Bean的名称。
	 * @return 返回Bean的实例。
	 */
	private Object getObjectFromApplication(ServletContext servletContext,String beanName){
		//通过WebApplicationContextUtils 得到Spring容器的实例。
		ApplicationContext application=WebApplicationContextUtils.getWebApplicationContext(servletContext);
		//返回Bean的实例。
		return application.getBean(beanName);
	}
}

 

 

分享到:
评论
3 楼 redcoatjk 2016-05-01  
那遇到事务怎么办?
事务是配置到service上.在Listener中调用service ?
2 楼 李庆辉 2015-05-19  
   
1 楼 骑驴走天下 2014-11-14  
膜拜大神,讲的清楚明白,今天正好遇到这个问题,本想用大神说的第一种解决方案了,但是总感觉加载了两遍,幸好发现了大神的帖子,恍然大悟啊,感谢大神给我等小白普及知识。怒赞!!!

相关推荐

    spring运行过程中动态注册bean

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

    spring容器学习笔记

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

    详解Spring中bean的作用域

    Spring 中 bean 的作用域是指 Spring IoC 容器中 bean 的生命周期和实例化方式。bean 的作用域决定了 bean 的实例化和生命周期的管理方式。在 Spring 中,bean 的作用域可以分为五种:singleton、prototype、...

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

    1. **初始化**:当Spring容器加载Bean定义时,它会创建Bean的实例。这通常通过无参构造函数完成。如果Bean定义中包含了工厂方法,那么会使用该方法来创建Bean。 2. **属性注入**:接着,Spring会根据Bean定义中的...

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

    Spring启动后获取所有拥有特定注解的Bean实例代码可以通过实现ApplicationListener接口来实现,这种方式可以实现系统参数的初始化,获取系统中所有接口服务清单等一系列需要在Spring启动后初始化的功能。

    spring 中特殊bean用法

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

    详解Spring中bean的scope以后使用

    在Spring框架中,Bean的作用域(scope)是一项非常重要的特性,它决定了Bean实例的生命周期和管理方式。正确理解和运用Bean的作用域对于优化应用程序性能、简化开发流程具有重要意义。本文将详细介绍Spring中不同...

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

    "Web容器中实例化Spring相关配置解析" Web容器中实例化Spring相关配置解析是指在Web容器中实例化Spring容器的相关配置解析。Spring框架是JavaEE应用程序的核心框架之一,它提供了丰富的功能和工具来开发企业级应用...

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

    对于Servlet、Filter和Listener,由于它们通常在Web应用启动时由容器实例化,而非由Spring管理,所以也不能直接使用@Autowired注解或其他常规的注入方式。为了解决这个问题,可以使用以下策略: 1. **Servlet**: ...

    spring技术详解

    Spring容器是生成Bean实例的工厂,并管理Spring中的Bean。Bean是Spring中的基本单位,在基于Spring的Java EE工程中,所有的组件都被当成Bean处理。 ApplicationContext事件机制是基于观察者设计模式实现的。通过...

    Spring实例化bean的方式代码详解

    总结来说,Spring提供了多种bean实例化方式,可以根据实际需求选择合适的方法。理解这些机制有助于更好地管理和控制Spring容器中的bean生命周期。希望本文内容对理解和使用Spring实例化bean有所帮助,如果有任何疑问...

    spring bean加载

    - **Bean的实例化**:根据`class`属性,Spring会使用反射创建Bean实例。 - **依赖注入**:Spring通过构造函数、setter方法、自动装配(byName或byType)等方式,将其他Bean注入到当前Bean中。 3. **Bean的作用域*...

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

    标题 "Spring3.1.3 Ioc在Web容器中的建立" 涉及的是Spring框架的一个关键特性——依赖注入(Dependency Injection,简称DI),以及如何在Web应用环境中配置和使用它。Spring是Java开发中最流行的轻量级框架之一,...

    JMS整合Spring实例

    <bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="messageListener" ref="messageListener" /> </bean> <bean id="message...

    让spring解决控制springboot中bean的加载顺序的问题.docx

    在Spring Boot应用中,控制Bean的加载顺序是一个关键的议题,尤其是在处理复杂依赖关系或需要在特定时刻执行初始化操作的场景。Spring Boot遵循"约定优于配置"的理念,简化了配置,但同时也带来了需要手动干预Bean...

    Spring的IoC容器

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

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

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

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

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

    flex整合Spring

    2. **定义SpringFactory**:自定义一个SpringFactory类,用于创建和管理Spring容器中的Bean实例。 3. **配置FlexServices**:在Flex项目中配置FlexServices,使其能够调用后端的Spring Bean。 4. **远程对象调用**:...

Global site tag (gtag.js) - Google Analytics