在spring web应用中,几乎所有的Bean的生命周期都是由spring控制的。但有时候我们想在自己new出来的对象中注入spring管理的bean属性,该怎么办呢?
比如下面的应用场景:有一套spring的web管理系统,用到finereport报表插件,而报表插件的数据源是java Bean,改java Bean的实例化是通过finereport插件new出来的,该Bean中用到的hibernate XXDao是由spring管理的,无法注入,解决方案如下:
a. 在web.xml中配置一个监听
<listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>
b.用下面的方法获取request
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
c.通过Spring提供的工具类获取ApplicationContext对象
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
其中 servletContext sc 可以具体 换成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外,由于spring是注入的对象放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 对象: WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
d.通过ApplicationContext获取注入的Bean对象
ac1.getBean("beanId"); ac2.getBean("beanId");