关闭

获取spring容器要小心的坑

标签: springweb应用
810人阅读 评论(0) 收藏 举报
分类:

情景:

今天想把一个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/
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

如何获取SpringMvc对应的子容器?

//获取父容器 WebApplicationContext rootWac=ContextLoader.getCurrentWebApplicationContext(); //获取servlet...
  • yiwanxingchena
  • yiwanxingchena
  • 2016-12-07 10:22
  • 956

Spring学习笔记四: 从Spring容器中获取Bean

通过BeanFactory获取bean实例package org.jiankunking.utils;import org.springframework.beans.BeansException; ...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2016-07-14 21:27
  • 2678

spring容器启动之我见(四、获取容器和获取容器中的bean)

1.我们经常会发现在我们的service中有注解而在dao上没有注解 看图 因为我们在spring容器初始化bean的时候,是把service当做一个bean ,而dao并不是一个bean...
  • baicp3
  • baicp3
  • 2015-06-03 10:47
  • 3937

Java类获取Spring容器的bean

获取Spring中的bean有很多种方式,再次总结一下:        第一种:在初始化时保存ApplicationContext对象ApplicationContext ac = new FileS...
  • wangshuxuncom
  • wangshuxuncom
  • 2016-03-15 14:19
  • 7661

获取当前的spring容器ApplicationContext 。

方法一:(获取当前的spring容器,任何java类中适用)           ServletContext application = ServletActionContext.getSer...
  • lang_man_xing
  • lang_man_xing
  • 2013-12-13 14:34
  • 13152

主动获取spring容器工具类SpringContextUtil

/** * 获取spring容器,以访问容器中定义的其他bean */ @Component public class SpringContextUtil implements Applicati...
  • zhiyi321
  • zhiyi321
  • 2016-06-13 17:55
  • 4391

Spring学习笔记四: 从Spring容器中获取Bean

通过BeanFactory获取bean实例package org.jiankunking.utils;import org.springframework.beans.BeansException; ...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2016-07-14 21:27
  • 2678

Java类获取Spring容器的bean

获取Spring中的bean有很多种方式,再次总结一下:        第一种:在初始化时保存ApplicationContext对象ApplicationContext ac = new FileS...
  • wangshuxuncom
  • wangshuxuncom
  • 2016-03-15 14:19
  • 7661

Spring 一、 之Bean容器初始化以及bean实例的获取

Spring IOC容器初始化及其所代理的Bean实例的获取 IOC容器主要用到两个包(以Spring3.2为例): 1)spring-beans-3.2.0.RELEASE.jar:主要是BeanF...
  • u012802702
  • u012802702
  • 2016-04-13 18:31
  • 2291

对map容器赋值需小心

C++中的容器是十分强大的功能。具体到都有什么功能,我就不细说了,我也还在研究中。总之,我感觉到了使用它的益处,给我提供了很多的方便,省了很多麻烦和时间。呃,我就是废话多,以上全是废话,可以略过。现在...
  • cs_wm
  • cs_wm
  • 2011-06-05 21:39
  • 3866
    个人资料
    • 访问:44388次
    • 积分:1098
    • 等级:
    • 排名:千里之外
    • 原创:63篇
    • 转载:2篇
    • 译文:0篇
    • 评论:2条
    友情链接
    文章分类
    最新评论