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,都是镜像. ...
随机推荐
- Python-实现socket简单地连续发数据
只需用while条件判断来实现 服务器端 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import socket serv ...
- 【jQuery】praseFloat()方法的用法及注意事项
[jQuery]praseFloat()方法的用法及注意事项 praseFloat(): 用于解析一个字符串,并返回一个浮点数 语法: praseFloat(strin ...
- 用户认证auth模块
一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...
- eclipse安装M2Eclipse插件
作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/7967333.html 图1: 图2 ...
- javaScript之this的五种情况
this一直是JavaScript研究的难题,特别是在笔试和面试中的各种程序分析问题中,也常常会被问到.下面来看一看this被运用的五中情况: (1) 纯粹的函数调用 函数最普通用法,此时 ...
- JavaScript高级程序设计学习笔记第十五章--使用Canvas绘图
一.基本用法 1.要使用<canvas>元素,必须先设置其 width 和 height 属性,指定可以绘图的区域大小.能通过 CSS 为该元素添加样式,如果不添加任何样式或者不绘制任何图 ...
- JQuery鼠标移动上去显示预览图
body中: <img src="../images/icon_view.gif" bigimg="../img.jpg" title="查看预 ...
- 最近一直是web前段,没什么意思,所以就不发资料了
最近一直是web前段,没什么意思,所以就不发资料了 版权声明:本文为博主原创文章,未经博主允许不得转载.
- 泛型中new()约束的用法
一..NET中支持的类型参数约束有以下几种 where T : struct T必须是一个结构类型where T : class T必须是一个类( ...
- C#面向对象三大特性之二:继承
面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低了耦合. 但在实际应用中,有好多对象具有相同或者相似的属性,比如有一个对象 果树 ...