1. ApplicationContext ac1 = new FileSystemXmlApplicationContext("com/spark/system/applicationContext.xml");//如果配置文件放在文件系统的目录下则优先使用该方式
  2. //com/spark/system/applicationContext.xml等价于"file:com/spark/system/applicationContext.xml"
  3. ac1.getBean("beanId");
  4. //ApplicationContext ac2=new ClassPathXmlApplicationContext("com/spark/system/applicationContext.xml");//如果配置文件在类路径下则优先使用该方式
  5. //com/spark/system/applicationContext.xml 等价于"classpath:com/spark/system/applicationContext.xml"
  6. ac2.getBean("beanId");

说明:

这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。


  1. public void getBean(HttpServletRequest req,HttpSession se)
  2. {
  3. // se.getServletContext() 也可以
  4. WebApplicationContext wac=(WebApplicationContext)req.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  5. wac.getBean("");
  6. }

说明:此种方式正是我们下面所提到的WebApplicationContextUtils 工具类中getWebApplicationContext(ServletContext sc) 方法的内部实现,以下方式是通过spring 提供的WebApplicationContextUtils 工具类获取WebApplicationContext

方式一:


  1. import org.springframework.web.context.support.WebApplicationContextUtils;
  2. ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)
  3. ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
  4. ac1.getBean("beanId");
  5. ac2.getBean("beanId");

说明:

这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。

上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

方式二:


  1. import org.springframework.web.context.WebApplicationContext;
  2. import org.springframework.web.context.support.WebApplicationObjectSupport;
  3. public class ApplicationContextUtils extends WebApplicationObjectSupport{
  4. public WebApplicationContext isgetWebApplicationContext(){
  5. return super.getWebApplicationContext();
  6. }
  7. }

继承自抽象类WebApplicationObjectSupport

说明:

抽象类WebApplicationObjectSupport 继承自ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该ApplicationObjectSupport 的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。当然直接继承ApplicationObjectSupport自己实现也可以,既然spring
提供了更方便的抽象工具类WebApplicationObjectSupport 建议使用它。以免出现问题

下面看WebApplicationObjectSupport关键源码(红色部分)


  1. /*** Eclipse Class Decompiler, copyright (c) 2012 cnfree (cnfree2000@hotmail.com) ***/
  2. package org.springframework.web.context.support;
  3. import java.io.File;
  4. import javax.servlet.ServletContext;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ApplicationObjectSupport;
  7. import org.springframework.web.context.ServletContextAware;
  8. import org.springframework.web.context.WebApplicationContext;
  9. import org.springframework.web.util.WebUtils;
  10. public abstract class WebApplicationObjectSupport <span style="color:#FF0000;">extends ApplicationObjectSupport</span> implements ServletContextAware{
  11. private ServletContext servletContext;
  12. public final void setServletContext(ServletContext servletContext){
  13. if (servletContext != this.servletContext){
  14. this.servletContext = servletContext;
  15. if (servletContext != null) initServletContext(servletContext);
  16. }
  17. }
  18. protected boolean isContextRequired(){
  19. return true;
  20. }
  21. protected void initApplicationContext(ApplicationContext context){
  22. super.initApplicationContext(context);
  23. if ((this.servletContext == null)
  24. && (context instanceof WebApplicationContext)){
  25. this.servletContext = ((WebApplicationContext)context)
  26. .getServletContext();
  27. if (this.servletContext != null)
  28. initServletContext(this.servletContext);
  29. }
  30. }
  31. protected void initServletContext(ServletContext servletContext){}
  32. <span style="color:#FF0000;">protected final WebApplicationContext getWebApplicationContext()
  33. throws IllegalStateException{
  34. ApplicationContext ctx = getApplicationContext();
  35. if (ctx instanceof WebApplicationContext){ return ((WebApplicationContext)getApplicationContext()); }
  36. if (isContextRequired()){ throw new IllegalStateException(
  37. "WebApplicationObjectSupport instance [" + this
  38. + "] does not run in a WebApplicationContext but in: "
  39. + ctx); }
  40. return null;
  41. }</span>
  42. protected final ServletContext getServletContext()
  43. throws IllegalStateException{
  44. if (this.servletContext != null){ return this.servletContext; }
  45. ServletContext servletContext = getWebApplicationContext()
  46. .getServletContext();
  47. if ((servletContext == null) && (isContextRequired())){ throw new IllegalStateException(
  48. "WebApplicationObjectSupport instance ["
  49. + this
  50. + "] does not run within a ServletContext. Make sure the object is fully configured!"); }
  51. return servletContext;
  52. }
  53. protected final File getTempDir() throws IllegalStateException{
  54. return WebUtils.getTempDir(getServletContext());
  55. }
  56. }

下面是ApplicationObjectSupport源码


  1. /*** Eclipse Class Decompiler, copyright (c) 2012 cnfree (cnfree2000@hotmail.com) ***/
  2. package org.springframework.context.support;
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import org.springframework.beans.BeansException;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.ApplicationContextAware;
  8. import org.springframework.context.ApplicationContextException;
  9. public abstract class ApplicationObjectSupport implements
  10. ApplicationContextAware{
  11. protected final Log logger;
  12. private ApplicationContext applicationContext;
  13. private MessageSourceAccessor messageSourceAccessor;
  14. public ApplicationObjectSupport(){
  15. this.logger = LogFactory.getLog(super.getClass());
  16. }
  17. public final void setApplicationContext(ApplicationContext context)
  18. throws BeansException{
  19. if ((context == null) && (!(isContextRequired()))){
  20. this.applicationContext = null;
  21. this.messageSourceAccessor = null;
  22. }
  23. else if (this.applicationContext == null){
  24. if (!(requiredContextClass().isInstance(context))){ throw new ApplicationContextException(
  25. "Invalid application context: needs to be of type ["
  26. + requiredContextClass().getName() + "]"); }
  27. this.applicationContext = context;
  28. this.messageSourceAccessor = new MessageSourceAccessor(context);
  29. initApplicationContext(context);
  30. }
  31. else if (this.applicationContext != context){ throw new ApplicationContextException(
  32. "Cannot reinitialize with different application context: current one is ["
  33. + this.applicationContext + "], passed-in one is ["
  34. + context + "]"); }
  35. }
  36. protected boolean isContextRequired(){
  37. return false;
  38. }
  39. protected Class requiredContextClass(){
  40. return ApplicationContext.class;
  41. }
  42. protected void initApplicationContext(ApplicationContext context)
  43. throws BeansException{
  44. initApplicationContext();
  45. }
  46. protected void initApplicationContext() throws BeansException{}
  47. public final ApplicationContext getApplicationContext()
  48. throws IllegalStateException{
  49. if ((this.applicationContext == null) && (isContextRequired())){ throw new IllegalStateException(
  50. "ApplicationObjectSupport instance [" + this
  51. + "] does not run in an ApplicationContext"); }
  52. return this.applicationContext;
  53. }
  54. protected final MessageSourceAccessor getMessageSourceAccessor()
  55. throws IllegalStateException{
  56. if ((this.messageSourceAccessor == null) && (isContextRequired())){ throw new IllegalStateException(
  57. "ApplicationObjectSupport instance [" + this
  58. + "] does not run in an ApplicationContext"); }
  59. return this.messageSourceAccessor;
  60. }
  61. }

通过源码很容易看得出spring做的这两次封装是如何获取到WebApplicationContext的  当然自己也可以实现底层接口自己封装。

比如:继承自抽象类ApplicationObjectSupport,抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

再比如:实现接口ApplicationContextAware,实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。

以上方法适合不同的情况,请根据具体情况选用相应的方法。

这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运行环境,尽量通过DI的方式获取需要的服务提供者。

PS:除了通过applicationContext来手动获取getBean("beanId")之外,还可以通过beanfactory工厂的.getBean("beanId")获取Bean 实例

例如:


  1. ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
  2. Resource resource=resolver.getResource("classpath:com/**/beans.xml");
  3. BeanFactory bf=new XmlBeanFactory(resource);
  4. bf.getBean("beanId");

有待研究 通过BeanFactory.getBean和ApplicationContext.getBean 的异同解释,和利弊以及使用情况。志同道合的同志可随时留言讨论,小弟欢迎大家一起学习

本文属于原创,请勿抄袭,谢谢!

关于spring获取webApplication.getBean多种途径和简单解释的更多相关文章

  1. paip.spring 获取bean getBean 没有beanid的情况下

    paip.spring 获取bean  getBean 没有beanid的情况下 spring能自动扫描带有注解的bean文件.. 作者Attilax  艾龙,  EMAIL:1466519819@q ...

  2. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  3. spring获取webapplicationcontext,applicationcontext几种方法详解

    法一:在初始化时保存ApplicationContext对象代码: ApplicationContext ac = new FileSystemXmlApplicationContext(" ...

  4. Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域

    Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...

  5. spring获取webapplicationcontext,applicationcontext几种方法详解(转)

    方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemXmlApplicationContext(&quo ...

  6. spring获取webapplicationcontext,applicationcontext几种方法详解(转载)

    转载自  http://www.blogjava.net/Todd/archive/2010/04/22/295112.html 方法一:在初始化时保存ApplicationContext对象 代码: ...

  7. spring 获取 WebApplicationContext的几种方法

    spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...

  8. Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式

    转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236  Spring获取ApplicationContex ...

  9. spring获取bean的时候严格区分大小写

    如题:spring获取bean的时候严格区分大小写 配置文件helloservice.xml中配置: <dubbo:reference id="IInsurance" int ...

随机推荐

  1. jupyter sparkmagic on hdp

    1.安装jupyter 2.安装sparkmagic 3.设置超时 "livy_server_heartbeat_timeout_seconds": 0, 4.设置集群模式 &qu ...

  2. POJ 1474 Video Surveillance 半平面交/多边形核是否存在

    http://poj.org/problem?id=1474 解法同POJ 1279 A一送一 缺点是还是O(n^2) ...nlogn的过几天补上... /********************* ...

  3. 经典的横线中间文字css布局---flex布局

    html: <div class="title"> <div class="line"></div> <div cla ...

  4. SpringCloud组件和概念介绍

    一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...

  5. 项目列表dl、dt、dd使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Javascript 6 种继承

    1.原型链继承 // 1.原型链继承的两个问题===>在借用构造函数中可以解决下下面的两个问题//problem: 在创建子类型的实例时,不能向超类型的实例传递参数(在这里就是不能向A()里传递 ...

  7. vue 刷新当前页面的方式

    1.使用window.location.href window.location.replace() window.location.reload() 会出现空白,体验不是很好 2.先进入一个空路由, ...

  8. 从头认识java-17.4 具体解释同步(3)-对象锁

    这一章节我们接着上一章节的问题,给出一个解决方式:对象锁. 1.什么是对象锁? 对象锁是指Java为临界区synchronized(Object)语句指定的对象进行加锁,对象锁是独占排他锁. 2.什么 ...

  9. 深度解析VC中的消息

    消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情 ...

  10. a-star算法

    http://blog.csdn.net/shanshanpt/article/details/8977512 这篇文章讲得不错. 所谓的启发函数,所谓权值之类(此处所谓的权值就是路劲的长度).YES ...