在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);
}
}

本文转载自http://wxinpeng.iteye.com/blog/1317659

spring listener引用spring中bean的更多相关文章

  1. Spring重点—— IOC 容器中 Bean 的生命周期

    一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...

  2. spring BeanFactory及ApplicationContext中Bean的生命周期

    spring bean 的生命周期 spring BeanFactory及ApplicationContext在读取配置文件后.实例化bean前后.设置bean的属性前后这些点都可以通过实现接口添加我 ...

  3. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

  4. 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期

    7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...

  5. 复习Spring第一课--Spring的基本知识及使用

    关于Spring: spring容器是Spring的核心,该容器负责管理spring中的java组件, ApplicationContext ctx  = new ClassPathXmlApplic ...

  6. Spring中bean的scope详解

    如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...

  7. 7 -- Spring的基本用法 -- 5... Spring容器中的Bean;容器中Bean的作用域;配置依赖;

    7.5 Spring容器中的Bean 7.5.1 Bean的基本定义和Bean别名 <beans.../>元素是Spring配置文件的根元素,该元素可以指定如下属性: default-la ...

  8. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  9. Spring配置文件中<bean>标签的scope属性

    转自:https://fj-sh-chz.iteye.com/blog/1775149 singleton  (默认属性) Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引 ...

随机推荐

  1. 64位python安装MySQL-python 1.2.5

    在64位的python直接安装MySQL-python 1.2.5有问题,参考http://www.linuxfly.org/windows_install_mysql_python_library/ ...

  2. libreoffice转office文档为pdf文档

    libreoffice5.0 --invisible --convert-to pdf:writer_pdf_Export --outdir  "/root/" "bb. ...

  3. ORA-12545:因目标主机或对象不存在,连接失败!

    错误原因是配置错误主机名 解决: 1. 搜索你自己安装的Oracle路径,找到这俩个文件 tnsnames.ora 和 listener.ora,修改这两个文件,修改HOST=自己的主机名 我的路径如 ...

  4. ubuntu设置环境变量

    sudo gedit /etc/environment path结尾处追加 路径,如::/opt/EmbedSky/4.3.3/bin source /etc/environment,或者重启电脑?? ...

  5. 关于 Android导出apk时碰到的[Unable to execute dex: Multiple dex files define]

    这是一个编译错误,在ADT的编译器和SDK的工具有差异或是版本不一致时常会出现的一个问题,解决的方案如下: 第一步: updated eclipse (Help->Check for updat ...

  6. JQuery移除事件

    移除事件 unbind(type [,data])     //data是要移除的函数 $('#btn').unbind("click"); //移除click $('#btn') ...

  7. Android官方提供的支持不同屏幕大小的全部方法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8830286 原文地址为:http://developer.android.com/ ...

  8. S3C2440之MMU

    转自:http://blog.chinaunix.net/uid-23193900-id-3187782.html 1.MMU简介    MMU(Memory Management Unit),内存管 ...

  9. Swing多线程

    Swing的单线程开发机制 多线程开发,显然要比单线程开发有趣.高效.美妙得多.特别是在Java这种天生支持多线程的语言中,更是如此.可是,Java最重要的组成部分Swing确是单线程的! 并非只有S ...

  10. sparkStreaming与Kafka整合

    createStream那几个参数折腾了我好久..网上都是一带而过,最终才搞懂..关于sparkStreaming的还是太少,最终尝试成功... 首先启动zookeeper ./bin/zookeep ...