1. 情景:

  2.  
  3. 今天想把一个web应用中的上传路劲更改一下
  4.  
  5. 于是就在配置文件作了如下变动:
  6.  
  7. <bean id="uploadServelt" class="com.xxxx.servlet.UploadServlet" scope="request" autowire="byType">
  8. <property name="savePath" ><value>"C:\\Users\\admin\\Desktop\\upload"</value></property>
  9. </bean>
  10.  
  11. 然后savePath这个变量仍然没有生效
  12.  
  13. 然后就想,会不会是没有关联到配置文件
  14. ApplicaitonContext的几种生成方法

  15. 一、ClassPathXmlApplicationContext

  16.  
  17. 这种方式是通过类名路径去找到配置文件,所以配置文件只能放在项目内部
  18. 二、FileSystemXmlApplicationContext

  19.  
  20. 这个跟java.io.File差不多,所以配置文件可以放在项目外部
  21. 三、WebApplicationContextUtils

  22.  
  23. 有两种方法去得到ApplicationContext
    1. getRequiredWebApplicationContext(ServletContext)
    1. getWebApplicationContext(ServletContext)
  24.  
  25. 推荐第一种方法,因为第一种方法当获取失败的时候会抛出异常,第二种只会返回null
  26. 原因

  27.  
  28. 重点来了!!为什么第三种方法会有可能获取失败呢??
  29.  
  30. 注意,这两种方法的参数都是ServletContext,所以推测,ApplicationContext是放在ServletContext里面
  31.  
  32. 查一查源码
  33.         String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
  34. 	public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
  35. 		return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  36. 	}
  37. 	public static WebApplicationContext getWebApplicationContext(ServletContext sc, String attrName) {
  38. 		Assert.notNull(sc, "ServletContext must not be null");
  39. 		Object attr = sc.getAttribute(attrName);
  40. 		if (attr == null) {
  41. 			return null;
  42. 		}
  43. 		if (attr instanceof RuntimeException) {
  44. 			throw (RuntimeException) attr;
  45. 		}
  46. 		if (attr instanceof Error) {
  47. 			throw (Error) attr;
  48. 		}
  49. 		if (attr instanceof Exception) {
  50. 			throw new IllegalStateException((Exception) attr);
  51. 		}
  52. 		if (!(attr instanceof WebApplicationContext)) {
  53. 			throw new IllegalStateException("Context attribute is not of type WebApplicationContext: " + attr);
  54. 		}
  55. 		return (WebApplicationContext) attr;
  56. 	}
  57.  
  58. 从源码看,ApplicationContext果然是放在ServletContext里面的,所以在获取之前,如果ServletContext里面没有ApplicationContext,那么就会抛出异常

  59. ApplicationContext储存在ServletContext的默认属性名是"org.springframework.web.context.WebApplicationContext.ROOT"

  60. 然而,平时的惯性思维都以为,这种获取ApplicaitonContext的方法是spring自动完成的,不需要我们new

  61. 解决方案

  62. 先在ApplicationListener初始化的时候,用方法一或者方法二创建一个ApplicaitonContext,然后setServletContext里面去,然后之后就可以用第三种方法获取了,注意set的时候的属性名称,可以自定义也可以用默认的"org.springframework.web.context.WebApplicationContext.ROOT"

  63. 如果是自定义的话,就要用这个方法去获取ApplicationContext

  64. WebApplicationContext.getWebApplicationContext(ServletContext sc, String attrName)
  65. 更正

  66. 之前说的有点不对
  67. 如果是web应用
  68. springContextLoaderListener启动的时候,会将WebApplicationContext放入ServletContext里面去,
  69. 所以我们就大胆的使用方法三来获取吧
  70.  
  71. 查看原文:http://139.129.55.235/2016/05/30/%e8%8e%b7%e5%8f%96spring%e5%ae%b9%e5%99%a8%e8%a6%81%e5%b0%8f%e5%bf%83%e7%9a%84%e5%9d%91/

获取spring容器要小心的坑的更多相关文章

  1. 普通Java类获取spring 容器的bean的5种方法

    方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...

  2. 获取spring容器上下文(webApplicationContext)的几种方法

    在很多情况,我们需要先获取spring容器上下文,即webApplicationContext,然后通过webApplicationContext来获取其中的bean.典型的情况是,我想在一个并未委托 ...

  3. 获取spring容器对象方法和原因

    为什么要获取Spring容器对象:拿到spring容器对象后,你就可以用spring管理的bean了,拿到bean,自然可以使用bean的方法,场景:比如jsp页面.通过注解是无法注入bean的,在开 ...

  4. 获取Spring容器Bean对象工具类

    在开发中,总是能碰到用注解注入不了Spring容器里面bean对象的问题.为了解决这个问题,我们需要一个工具类来直接获取Spring容器中的bean.因此就写了这个工具类,在此记录一下,方便后续查阅. ...

  5. Java代码获取spring 容器的bean几种方式

    一.目的 写了一个项目,多个module,然后想在A模块中实现固定的config注入,当B模块引用A时候,能够直接填写相对应的配置信息就行了.但是遇到一个问题,B引用A时候,A的配置信息总是填充不了, ...

  6. 【Spring学习笔记-3.1】让bean获取spring容器上下文(applicationContext.xml)

    *.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:# ...

  7. java web中如何获取spring容器中定义的bean----WebApplicationContext的使用

    本文简单编写一个servlet来获取spring容器中管理的<bean  id="dateBean" class="java.util.Date" sin ...

  8. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  9. SpringBoot 之 普通类获取Spring容器中的bean

    [十]SpringBoot 之 普通类获取Spring容器中的bean   我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器 ...

随机推荐

  1. APP 版本更新 流程(已上架APP,提交新版本)

    背景: 今天发布app的新版本, 可是无奈换了电脑, 没有了以前上架时候的发布证书和描述文件. 但是没关系, 依然可以上传成功,哈哈哈~ 虽然走了很多弯路 - -|| 如果是向 App Store 提 ...

  2. Design2:数据层次结构建模之二

    MSSql提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌套关系,并 ...

  3. 【WP 8.1开发】一键锁屏

    在WP8的时候,关于如何关闭屏幕,国内外都有不少文章了,大家有兴趣地可以搜搜,很多,我就不给链接了,因为稍后我的例子中会有. 其实,关闭屏幕是调用了未开放的API,正因为这个API未开放的,不敢保证所 ...

  4. Android入门(十九)WebView

    原文链接:http://www.orlion.ga/676/ WebView可以在自己的应用程序中嵌入一个浏览器来展示网页. 创建一个项目WebViewDemo,修改activity_main.xml ...

  5. JUnit4使用

    1.导入Junit4jar包: Eclipse中在项目上右键点击Bulid Path,然后再点击Add libraries,选择JUnit 2.初次使用 首先先创建一个java项目如下: Demo.j ...

  6. 绘制 ToggleButton --重写view

    package com.example.compoundbuttonview.view; import com.example.compoundbuttonview.R; import android ...

  7. SharePoint Server 2013开发之旅(四):配置工作流开发和测试环境

    工作流这个功能,在SharePoint Server 2013中做了很大的改动.我们可以从微软官方的文档中了解一下大概的情况 http://technet.microsoft.com/zh-cn/li ...

  8. Java多线程系列--“JUC原子类”01之 框架

    根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...

  9. [OpenCV] Samples 04: contours2

    要先变为二值图像:cvThreshold 提取轮廓:cvFindContours #include "opencv2/imgproc/imgproc.hpp" #include & ...

  10. Windows Azure HandBook (3) 浅谈Azure安全性

    <Windows Azure Platform 系列文章目录> 2015年3月5日-6日,参加了上海的Azure University活动.作为桌长与微软合作伙伴交流了Azure相关的技术 ...