情景:
今天想把一个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
- getRequiredWebApplicationContext(ServletContext)
- 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容器的方法
在Service端,自定义ApplicationContext,获取Spring容器。从而,通过编码的形式,手动获取注册到容器中的对象。
spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听
主要介绍了Spring实战之让Bean获取Spring容器操作,结合实例形式分析了Bean获取Spring容器的相关原理、实现方法及操作注意事项,需要的朋友可以参考下
Spring容器 .ppt Spring容器 .ppt
实现将一个接口动态代理,并将该代理对象在spring容器初始化完成前注册到spring容器中。实现可以通过@Autowired等注释或其他方法从spring容器中获取该代理对象
在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息,在大数据采集项目中用到的,已经测试过了
SpringBoot 应用动态编译 Java 源码并注入 Spring 容器,实现动态修改接口和抽象类的实现。注意,项目以 Jar 包形式启动时要在命令行引入 tools.jar 的包,IDEA下可直接调试。 基于接口、抽象类实现不停机动态调整...
Spring容器的通俗理解及简单写法 手动写一个非常粗犷且简单的IOC容器。 用到了java的一些基础知识,比如说读取文件资源,反射,自定义注解的实现及使用等
Spring 容器后处理器
NULL 博文链接:https://huangminwen.iteye.com/blog/1874200
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
他们都可代表Spring容器,Spring容器是生成Bean实例的工厂,并且管理容器中的Bean。 Bean是Spring管理的基本单位,在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源、Hibernate的...
spring容器学习笔记
使用了dom4j相关包,spring通过反射机制实现bean的创建等,完成bean的管理
获取springbean对象
spring动态向容器中添加bean和删除指定bean,不需要重启应用
NULL 博文链接:https://java-mzd.iteye.com/blog/829890
Spring把Bean放在这个容器中,普通的类在需要的时候,直接用getBean()方法取出
spring简单实例,一看就懂,介绍spring基本配置