情景:
今天想把一个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框架的jar包以及如何配置开发环境。可以通过访问Spring官网下载最新版的Spring框架jar包。下载完成后,需要将相应的jar包添加到项目的classpath中。通常需要添加的核心jar包包括...
- **异常处理:** 当Hibernate在运行时遇到错误时,如`org.springframework.beans.factory.BeanCreationException`,这通常意味着Spring容器在创建某个Bean时失败,可能是由于配置错误或依赖关系未正确解决导致的。...
由于MANAGER是通过Spring IoC容器创建的BEAN,因此DWR的creator应配置为'spring'。例如,如果有一个名为`HostGroupManager`的MANAGER,配置可能如下: ```xml <create creator="spring" javascript=...
SSM框架是Java web开发中常用的三大框架Spring、Spring MVC和MyBatis的组合,用于构建高效、灵活的Web应用程序。本项目是一个基于SSM框架的高校学生选课系统,旨在提供一个方便、快捷的选课平台,让学生能够根据自己...
之前被我不小心把线上代码删了QAQ,网站展示暂时失败)用户名: 时崎狂三密码: 123456(PS: 或者其它9个精灵名字)(PS: 项目现在已经不能注册,请使用现有账号密码登录 by.12.21)项目截图用到的技术技术名称Spring Boot...
3. **Spring框架**:Spring是Java企业级应用的核心框架,它提供了大量的功能,包括DI(依赖注入)、AOP、事务管理、容器、MVC等,使得开发者能够更专注于业务逻辑,而不是底层实现。 4. **SpringMVC**:SpringMVC是...
Spring的依赖注入可以通过反射来创建和配置对象,而泛型则用于确保容器中存储的对象类型正确。此外,很多工具类库,如Apache Commons Lang和Google Guava,也利用泛型和反射提高了代码的灵活性和可维护性。 总的来...
首先,Spring作为核心容器,负责管理应用中的对象,包括依赖注入(DI)和面向切面编程(AOP)。依赖注入使得代码更加松耦合,易于测试和维护。AOP则提供了在不修改原有代码的情况下,添加新功能或监控程序行为的能力...
Spring框架提供了容器管理,使得组件化开发更为容易,同时通过AOP(面向切面编程)支持事务管理和日志记录。SpringMVC负责处理HTTP请求,将前端发送的请求映射到后端的控制器,然后调用业务逻辑进行处理。MyBatis则...
Spring作为整体的容器,负责依赖注入和管理Bean,提高代码的可测试性和解耦性;SpringMVC则负责处理HTTP请求,实现Model-View-Controller的设计模式;MyBatis作为持久层框架,简化了数据库操作,使得SQL查询与Java...
在项目中,Spring用于管理服务层和DAO层,通过IoC(Inversion of Control)容器实现组件间的依赖关系,使得代码更加模块化,易于维护。SpringMVC则处理HTTP请求,将请求转发给相应的处理器,并返回响应。MyBatis则...
SSM框架是Java Web开发中常用的三大组件集成框架,其中Spring作为核心容器,负责管理应用对象的生命周期和依赖注入;SpringMVC是处理HTTP请求和响应的框架,提供模型-视图-控制器模式来构建Web应用程序;MyBatis则是...
需要注意的是,在导入库时要小心,避免不必要的依赖冲突导致的问题。如果出现如`Unable to load configuration.`之类的错误,通常是由于某些JAR包存在问题或版本不兼容导致的。解决方法之一是检查并确保所有库版本...
而在自动模式下,事务控制可以委托给容器(如Spring)处理。 7. **缓存机制**:MyBatis提供了一级缓存和二级缓存。一级缓存是SqlSession级别的,默认开启,能减少对数据库的重复查询。二级缓存是Mapper级别的,可...