在listener 中获取 spring context 从而得到 bean 的方法.
By:Roy.LiuLast updated:2013-11-06
写listener , 我的目的是系统在启动的时候,就将缓存的数据在这里放入到自己写的缓存类中去,但我需要调用 spring 已经注入的 bean ,包括各种 service 以及 dao 层。因此需要 得到这些 bean 进行处理。可以利用 spring 自己提供的 WebApplicationContextUtils 来实现, 比如有如下例子:
但要注意,在web.xml 里面配置listener 的时候,需要将 spring 的 contextLoader 配置在前面加载才可以
但我发现,上面用 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 中去,这样才容易得到.
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 中去,这样才容易得到.
From:一号门
COMMENTS