Spring那些不得不知的细节
1、SpringMVC拦截器的url-pattern和RequestMapping
案例:
url-pattern为/rest/* http请求为:/rest/query/id 那么requestMapping为:/query/id
2、post请求方式对MVC控制器的影响
Post请求的四种ContentType:
application/x-www-form-urlencoded 常规表单方式提交
multipart/form-data 带文件上传的表单
application/json Json格式文本
text/xml 一般文本,例如webservice
默认情况下大家接收参数用一个pojo,但是它只能接收get请求和post请求的application/x-www-form-urlencoded形式
如果使用json请求,那么请在参数前面加上@RequestBody
如果文件上传,请加上@MultiparyFile
附:json解析配置(jakson2.x)<mvc:annotation-driven>自动注入jakson的bean,转换器是为了保证编码问题
<!-- 处理请求返回json字符串的中文乱码问题 以及映射器、适配器和试图解析器的自动配置-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
3、web中url-pattern中的 / 与 /* 的问题
解:首先大家都知道"/*"可以匹配所有url,包括带扩展名的,一般只用在过滤器上。
而"/"很多人理解成不能拦截带扩展名的,这种理解是错误的!它其实也能拦截“.js”,“.css”,".png"等静态资源的访问。
看官方文档可知,它是tomcat的默认servlet,当其他的url-pattern匹配不上时都会走这个servlet。它除了能够处理静态资源还能够处理HTTP缓存请求,媒体(音频/视频)数据流和文件下载简历。所以如果我们的项目中配置了"/",会覆盖掉tomcat中的default servlet。
tomcat服务器的web.xml配置:
所以当springMVC的前端控制器配置为“/”时,需要在主配置文件中配置放行静态资源。
4、Spring提供了对properties文件读取的支持
配置文件加载属性文件:
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:resource/*.properties" />
配置文件中使用:${propertyName}
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<property name="maxActive" value="10" />
<property name="minIdle" value="5" />
</bean>
Java程序中使用:Spring注解自动注入
@Value("${REDIS_KEY_CONTENT}")
private String REDIS_KEY_CONTENT;
5、Spring提供的md5加密,以后再也不用手写了

6、Spring的IOC容器
1)如果用了SpringMVC,并且容器分别由spring和springMVC管理,那么存在两个容器,MVC容器可以访问spring的,反之不可以。
2)MVC容器只能访问父容器的bean,不能访问properties属性。如图

7、SpringMVC中@ResponseBody返回中文乱码问题
默认处理:不经过视图解析器,而是经过转换器转换后直接输出(加<mvc:annotation-driven />)
如果遇到Object对象,默认会采用MappingJackson2HttpMessageConverter(这是jakson2.x的),而且编码自动是UTF-8,所以一般不用配置
如果遇到String对象,默认会采用StringHttpMessageConverter进行解析,但是默认编码是ISO8859-1
配置如下即可解决
<!-- 处理请求返回json字符串的中文乱码问题 以及映射器、适配器和试图解析器的自动配置 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
也可以这样,估计是内部自动转换的吧
<!-- 处理请求返回json字符串的中文乱码问题 以及映射器、适配器和试图解析器的自动配置 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
8、在Spring启动后执行立马执行某项任务,比如定时任务。
类似于在系统启动时做操作一样,只不过一个是ServletContextListener,而监听Spring的是InitializingBean
/**
* @Describtion: (执行任务调度). <br/>
* @date: 2018年6月9日 下午12:46:45 <br/>
* @author Beats <br/>
* @version v1.0 <br/>
* @since JDK 1.8
*/
@Component
public class SpringContextLisener implements InitializingBean { @Autowired ExamStatusScanner examStatusScanner; @Override
public void afterPropertiesSet() throws Exception {
//启动
examStatusScanner.run();
}
}
9、配置在spring项目中随时随地获取已经注册好的Bean。
某些情况下,一个类内部需要的对象无法通过正常方式注入进去,比如Quartz通过反射加载job,此时job内就无法使用注解注入。
例外情况代码:

此时就无法通过xml或者注解来注入了

解决方案,手动注入,自定义SpringUtil
1、创建SpringUtil,该类继承ApplicationContextAware
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext ac;
@Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
ac = arg0;
}
public static ApplicationContext getApplicationContext() {
return ac;
}
/**
* 获取对象
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static Object getBean(String beanName) {
Object obj = null;
obj = ac.getBean(beanName);
return obj;
}
/**
* 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
* @param name bean注册名
* @param requiredType 返回对象类型
* @return Object 返回requiredType类型对象
* @throws BeansException
*/
public static <T> T getBean(String beanName, Class<T> type) {
T obj = null;
obj = ac.getBean(beanName, type);
return obj;
}
/**
* 如果BeanFactory包含所给名称匹配的bean返回true
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return ac.containsBean(name);
}
/**
* 判断注册的bean是singleton还是prototype。
* 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
* @param name
* @return boolean
* @throws NoSuchBeanDefinitionException
*/
public static boolean isSingleton(String name) {
return ac.isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类型
* @throws NoSuchBeanDefinitionException
*/
public static Class<?> getType(String name) {
return ac.getType(name);
}
}
2、在Spring中注册他,单例模式
<!-- springUtil的创建 ,实现ApplicationContextAware接口 -->
<bean id="springUtil" class="henu.util.SpringUtil" scope="singleton" />
之后就可以随时调用。
10、随时随地获取Spring的配置文件键值对
都知道在spring中可以通过@Value来自动注入资源文件中的键值对信息,但是SpringMVC是无法读取到Spring的资源文件的。
所以,可以自定义一个工具类,随时随地获取资源文件信息,并且不用写注解。
1、创建工具类,继承PropertyPlaceholderConfigurer
public class PropertyUtil extends PropertyPlaceholderConfigurer {
private static Map<String,String> propertyMap;
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
super.processProperties(beanFactoryToProcess, props);
propertyMap = new HashMap<String, String>();
for (Object key : props.keySet()) {
String keyStr = key.toString();
String value = props.getProperty(keyStr);
propertyMap.put(keyStr, value);
}
}
//static method for accessing context properties
public static String getProperty(String name) {
return propertyMap.get(name);
}
}
2、在配置文件中注册
是不是很熟悉,跟context:property-placeholder 加载配置文件一样吧
<!-- 自定义配置文件获取 -->
<bean id="propertyConfigurer" class="henu.util.PropertyUtil" scope="singleton">
<property name="location" value="classpath:res.properties"/>
<property name="fileEncoding" value="UTF-8"/>
</bean>
3、使用:PropertyUtil.getProperty(propName)即可
11、AOP拦截控制器
将AOP配置在SpringMVC中即可,因为父子容器关系。
12、AOP中获取request和response
1、自动注入
@Autowired
private HttpServletRequest request; @Autowired
private HttpServletResponse response;
2、配置监听器
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Spring那些不得不知的细节的更多相关文章
- spring对bean的管理细节
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring Boot 你所不知道的超级知识学习路线清单
因而 Spring Boot 应用本质上就是一个基于 Spring 框架的应用,它是 Spring 对“约定优先于配置”理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于 Spring 生态圈的 ...
- Java进阶知识17 Spring Bean对象的创建细节和创建方式
本文知识点(目录): 1.创建细节 1) 对象创建: 单例/多例 2) 什么时候创建? 3)是否延迟创建(懒加载) 4) 创建对象之后, ...
- Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...
- springaop——AspectJ不可不知的细节
springaop简介 springaop是spring对AOP技术的具体实现,它是spring框架的核心技术.springaop底层使用JDK动态代理或CGLIB动态代理技术实现. 应用场景: 在多 ...
- Android任务和返回栈完全解析,细数那些你所不知道的细节
附:Android task详解 出处:http://blog.csdn.net/guolin_blog/article/details/41087993 原文: http://developer. ...
- spring来了-03-bean创建细节
对象创建:单例/多例 [bean节点的属性scope] scope="singleton", 默认值,即默认是单例 [service/dao/工具类] scope=&qu ...
- Maven中央仓库——你可能不知道的细节
地址 —— 目前来说,http://repo1.maven.org/maven2/是真正的Maven中央仓库的地址,该地址内置在Maven的源码中,其它地址包括著名的ibiblio.org,都是镜像. ...
随机推荐
- 集群重启某一主机下所有osd down解决办法
标签(空格分隔): ceph 运维 osd 问题描述: 掉电后,上电发现cluster中的主机node3下的所有osd都down掉了,通过命令重启node3的ceph-osd服务,osd依然无法up: ...
- Redis的安装和配置文件
实验环境:Centos6.8 Redis版本:3.0.6 下载Redis,并放到/usr/local/soft下: yum -y install gcc automake autoconf libto ...
- 进程vs线程
内存中的内容不同 进程->{ 进程是系统分配资源的最基本单位,线程是进程的一部分, 进程中存储文件和网络句柄 } 线程->{ 栈(每个线程都有一个栈空间) pc(当前或下一条指令的地址,指 ...
- Project Server2016升级安装问题项目中心无法显示
sharepoint 2016升级后,project server 相关中心页面出现空白页面,这是是sharepoint2016一个bug,解决方案用PWA.resx内容替换PWA.en-us.res ...
- content-disposition attachment filename 在Firefox和IE中得到不同的结果
在Firefox中需要把filename 用双引号包起来,才能得到想要的名字,不然如果含有空格,会丢掉空格后面的部分.而IE会把空格转为_,因此也需要HttpUtility.UrlPathEncode ...
- SAP 销售订单中采购标识无法修改
VA03中的销售订单第四个物料没有ZA选项, 错误提示:计划行类别ZA未定义 原因: MM03中的 MRP2---采购类型未被定义
- zookeeper相关知识的总结:
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...
- hbase->Mapreduce->hbase
Hbase对Mapreduce API进行了扩展,方便Mapreduce任务读写HTable数据. package taglib.customer; import java.io.IOExceptio ...
- jquery事件之事件委托和事件切换
一.事件委托函数: 方法名 说明 语法 (events 事件类型,data数据,handler 事件处理函数,selector 选择器) live 用于为指定元素的一个或多个事件绑定事件处理函数. j ...
- Boost Python学习笔记(一)
开发环境搭建 下载源码 boost_1_66_0.tar.gz 生成编译工具 # tar axf boost_1_66_0.tar.gz # cd boost_1_66_0 # yum install ...