在listener 中获取 spring context 从而得到 bean 的方法.

摘要: 写listener , 我的目的是系统在启动的时候,就将缓存的数据在这里放入到自己写的缓存类中去,但我需要调用 spring 已经注入的 bean ,包括各种 service 以及 dao 层。因此需要 得到这些 bean 进行处理。可以利用 spring 自己提供的 WebApplicationContextUtils 来实现, 比如有如下例子:

写listener , 我的目的是系统在启动的时候,就将缓存的数据在这里放入到自己写的缓存类中去,但我需要调用 spring 已经注入的 bean ,包括各种 service 以及 dao 层。因此需要 得到这些 bean 进行处理。可以利用 spring 自己提供的 WebApplicationContextUtils 来实现, 比如有如下例子:

public class InitApp implements ServletContextListener {	


public void contextInitialized(ServletContextEvent sce) {
	WebApplicationContext rwp = WebApplicationContextUtils.getRequiredWebApplicationContext(sce.getServletContext());
	MyService myservice= (CommonsMultipartResolver)rwp.getBean("myservice");
    System.out.println("init app :" + myservice);
    // 然后进行自己的处理, 想做什么都可以.
   }
public void contextDestroyed(ServletContextEvent servletContextEvent) {
   }
}


但要注意,在web.xml 里面配置listener 的时候,需要将 spring 的 contextLoader 配置在前面加载才可以
     
	   org.springframework.web.context.ContextLoaderListener     
	 
  
         
	   upload.controllers.InitApp     
	


但我发现,上面用 WebApplicationContextUtils 得到的 beanfactory 的列表里面 只有 applicationContext.xml 里面的 bean 和 用 spring mvc component scan 自动注入的类。 其实我还有另外一些 bean 是在 spring-servet.xml 中注入的, 但是 得到的 beanFactory 中并不包含这些。这说明了是不能获取到 spring-servlet.xml 中的 bean 的。

后来又测试 在 listener 上加上 @component 等,还是不可以。
后来仔细想了下,应该是不可以的,原因如下 : application 启动加载顺序 : listener, filter, servlet.... listener 是最开始加载的。而我在 spring mvc配置文件 spring-servlet.xml 配置的bean 应该是在 “org.springframework.web.servlet.DispatcherServlet” 初始化的时候才加载,这必须在 listener 之后,所以我怎么也拿不到这里面的bean . 同理,这也是在controller 中拿到,并自动注入的原因,因为controller 在 DispatcherServlet 后加载。

所以,用spring mvc 的时候,如果想在 listener 中加载一些bean ,应该放到 applicationContext.xml 中去,这样才容易得到.

上一篇: 最适合中国国情的jquery file upload 批量上传改版插件,结合spring mvc
下一篇: junit 基于 spring 工程的测试基类编写
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号