情景:

今天想把一个web应用中的上传路劲更改一下 于是就在配置文件作了如下变动: <bean id="uploadServelt" class="com.xxxx.servlet.UploadServlet" scope="request" autowire="byType">
<property name="savePath" ><value>"C:\\Users\\admin\\Desktop\\upload"</value></property>
</bean> 然后savePath这个变量仍然没有生效 然后就想,会不会是没有关联到配置文件

ApplicaitonContext的几种生成方法

一、ClassPathXmlApplicationContext

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

二、FileSystemXmlApplicationContext

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

三、WebApplicationContextUtils

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

原因

重点来了!!为什么第三种方法会有可能获取失败呢?? 注意,这两种方法的参数都是ServletContext,所以推测,ApplicationContext是放在ServletContext里面 查一查源码
        String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
}
public static WebApplicationContext getWebApplicationContext(ServletContext sc, String attrName) {
Assert.notNull(sc, "ServletContext must not be null");
Object attr = sc.getAttribute(attrName);
if (attr == null) {
return null;
}
if (attr instanceof RuntimeException) {
throw (RuntimeException) attr;
}
if (attr instanceof Error) {
throw (Error) attr;
}
if (attr instanceof Exception) {
throw new IllegalStateException((Exception) attr);
}
if (!(attr instanceof WebApplicationContext)) {
throw new IllegalStateException("Context attribute is not of type WebApplicationContext: " + attr);
}
return (WebApplicationContext) attr;
}

从源码看,ApplicationContext果然是放在ServletContext里面的,所以在获取之前,如果ServletContext里面没有ApplicationContext,那么就会抛出异常

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

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

解决方案

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

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

WebApplicationContext.getWebApplicationContext(ServletContext sc, String attrName)

更正

之前说的有点不对
如果是web应用
当spring的ContextLoaderListener启动的时候,会将WebApplicationContext放入ServletContext里面去,
所以我们就大胆的使用方法三来获取吧

查看原文: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. How Google TestsSoftware - The Life of a SET

    SETs are Software Engineersin Test. They are software engineers who happen to write testing function ...

  2. linux下编译安装curl

    linux下编译安装curl 1.下载curl git clone https://github.com/curl/curl.git 2.在curl目录下生成configure文件 ./buldcon ...

  3. CSS三列布局

    × 目录 两侧定宽中间自适应 两列定宽一侧自适应 中间定宽两侧自适应一侧定宽两列自适应三列自适应总结 前面的话 前面已经介绍过单列定宽单列自适应和两列自适应的两列布局.本文介绍三列布局,分为两侧定宽中 ...

  4. nodejs生成多层目录和生成文件的通用方法

    /** *生成多层目录 * @param dir 多层目录 * @param split 分隔符,ex:'/' 对应的目录地址:'2015/10/10' * @param mode 目录权限(读写权限 ...

  5. Ext.Net全部Icon图标名称展示

  6. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  7. Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark Streaming简介 1.1 概述 Spark Streaming 是Spa ...

  8. HTML5第一讲

    第一回合:什么是HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTM ...

  9. C语言打印记事本内搜索字符串所在行信息

    本程序采用C语言编写,使用方法: 1.双击“甲骨文字符串查询作品.exe”运行程序; 2.运行前请确保此可执行程序目录下有1.txt文件. 3.根据提示输入一个字符串,程序将显示存在所搜索字符串的所有 ...

  10. c#实现分组服务器,单一无重复生成ID

    class Program { static void Main(string[] args) { List<Thread> threads = new List<Thread> ...