方法一在初始化时保存ApplicationContext对象
代码
ApplicationContext ac = new FileSystemXmlApplicationContex(applicationContextxml);
acgetBean(beanId);
说明
这种方式适用于采用Spring框架的独立应用程序需要程序通过配置文件手工初始化Spring的情况
方法二通过Spring提供的工具类获取ApplicationContext对象
代码
import orgsprntextsupportWebApplicationContextUtils;
ApplicationContext ac = WebApplicationContextUtilsgetRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac = WebApplicationContextUtilsgetWebApplicationContext(ServletContext sc)
acgetBean(beanId);
acgetBean(beanId);
说明
这种方式适合于采用Spring框架的B/S系统通过ServletContext对象获取ApplicationContext对象然后在通过它获取需要的类实例上面两个工具方式的区别是前者在获取失败时抛出异常后者返回null
其中 servletContext sc 可以具体 换成 servletgetServletContext()或者 thisgetServletContext() 或者 requestgetSession()getServletContext();
另外由于spring是注入的对象放在ServletContext中的所以可以直接在ServletContext取出WebApplicationContext 对象
WebApplicationContext webApplicationContext = (WebApplicationContext) servletContextgetAttribute(WebApplicationContextROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
方法三继承自抽象类ApplicationObjectSupport
说明
抽象类ApplicationObjectSupport提供getApplicationContext()方法可以方便的获取到ApplicationContextSpring初始化时会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入
方法四继承自抽象类WebApplicationObjectSupport
说明
类似上面方法调用getWebApplicationContext()获取WebApplicationContext
方法五实现接口ApplicationContextAware
说明
实现该接口的setApplicationContext(ApplicationContext context)方法并保存ApplicationContext 对象Spring初始化时会通过该方法将ApplicationContext 对象注入
以上方法适合不同的情况请根据具体情况选用相应的方法
这里值得提一点的是系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了因为这些类是知道它们是运行在Spring框架上的因此系统中应该尽量的减少这类应用使系统尽可能的独立于当前运行环境尽量通过DI的方式获取需要的服务提供者
然后在Action中编写如下代码得到Context(我是覆盖了Struts Action的setServlet方法也许还有更好的方法)
public void setServlet(ActionServlet servlet){
supersetServlet(servlet);
ServletContext servletContext = servletgetServletContext();
WebApplicationContext wac = WebApplicationContextUtilsgetRequiredWebApplicationContext(servletContext);
// get yours beans
}
我需要在spring的bean中直接获取这下可和我们常规的操作有些不同因为spring的bean都是pojo的根本见不着servletconfig和servletcontext的影子
这里我需要指出spring给我们提供了两个接口orgsprntextServletContextAware和
orgsprntextServletConfigAware我们可以让我们的bean实现上边的任何一个接口就能获取到servletContext了
代码如下
public class DicBean implements ServletContextAware{
private ServletContext servletContext;
public void setServletContext(ServletContext sc) {
thisservletContext=sc;
Systemoutprintln(项目的绝对路径为+servletContextgetRealPath(/));
}
}