在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 配置在前面加载才可以
<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 中去,这样才容易得到.
From:一号门
RELATED ARTICLES
- Spring boot 读取配置文件properties
- Spring boot 非web版(jar)入门配置程序-maven工程源码
- Spring4 + Quartz Scheduler 执行定时任务例子
- Spring mvc @PathVariable 得到的参数包含点号的处理办法
- 同时绑定 spring validator和hibernate validator作为校验
- Spring security method 方法级别的权限控制
- spring mvc controller间跳转 重定向 传参数的几种方式
- 利用annotation与AOP对任何方法实现拦截. 附源码下载
- 在spring中常被忽视的注解 @Primary
- 在servlet中用spring @Autowire 注入.
- Spring MVC 返回 xml 数据的配置方法
- 给同事做的Spring data JPA培训的教程及例子
- 给新同事做的spring mvc 培训教程及例子
- mybatis spring 集成 bootstrap 例子一个
- spring3 restful 服务迁移到 spring4需要注意的事项
- maven 工程启动找不到 Spring ContextLoaderListener 的解决办法
- spring mvc jackson 防止XSS 注入方法
- spring mvc inteceptor 拦截器实现计算controller 的执行时间
- spring security JDBC 数据库实现,5个表, 例子下载
- spring security 教程入门
COMMENTS