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

写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 配置在前面加载才可以
程序代码 程序代码

<listener>    
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
    </listener>
  
    <listener>    
       <listener-class>upload.controllers.InitApp</listener-class>    
    </listener>


但我发现,上面用 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  中去,这样才容易得到.

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: spring listener
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.