在spring和各种MVC整合的框架下,在我们自己写的代码中要使用ApplicationContext是不方便的。
spring有一个类
spring有一个类
org.springframework.web.context.support.WebApplicationContextUtils
它有一个static的方法getWebApplicationContext(ServletContext sc)
可以使我们得到一个ApplicationContext的引用,
但这个方法有一个参数ServletContext,它是Servlet容器提供的上下文,在非Servlet环境下是得不到的。
我们可以定义一个servlet,该servlet配置为被容器第一个加载,它可以得到ServletContext,从而得到ApplicationContext的引用,
我们再把这个引用保存在一个所用应用都能访问到的地方。
- package xxx.utils;
- import org.springframework.context.ApplicationContext;
- public class SpringBeanProxy {
- private static ApplicationContext applicationContext;
- public synchronized static void setApplicationContext(ApplicationContext arg0) {
- applicationContext = arg0;
- }
- public static Object getBean(String beanName){
- return applicationContext.getBean(beanName);
- }
- }
- package xxx.servlets;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import xxx.utils.SpringBeanProxy;
- public class SpringBeanInitServlet extends HttpServlet {
- public void init(ServletConfig arg0) throws ServletException {
- SpringBeanProxy.setApplicationContext(WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()));
- }
- }
在web.xml中
由于listener先于servlet加载,所以可以确保SpringBeanInitServlet加载时spring已经初始化好了,
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
- <servlet>
- <servlet-name>SpringBeanInitServlet</servlet-name>
- <servlet-class>
- xxx.SpringBeanInitServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
如果你使用的是servlet加载spring就要注意调整这两个servlet的启动顺序了。
这时可以在程序的任何地方,使用 SpringBeanProxy.getBean("beanName")得到一个bean了。