消息转换器
在Spring中org.springframework.http.converter.HttpMessageConverter规范中定义了Http请求和响应的消息转换规范, 我们知道SpringMvc可以接收不同的消息形式,也可以将不同的消息形式响应回去(最常见的是json);这些消息所蕴含的”有效信息”是一致的,那么各种不同的消息转换器,都会生成同样的转换结果. 至于各种消息间解析细节的不同,就被屏蔽在不同的HttpMessageConverter实现类中.
SpringMVC中使用FastJson作为转换器
通过SpringMvc中message-converts配置FastJson作为转换器
1 | <!-- 默认的注解映射的支持,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping --> |
Fastjson轻量级属性转换
定义示例对象模型
做fastjson轻量注解配置, 更多配置参考https://github.com/alibaba/fastjson/wiki/JSONField
1 | public class ModelTest implements Serializable{ |
定义示例Controller
示例完成序列化数据到前端和提交JSON数据转换成对象模型
1 |
|
测试对象序列化到前端展示
1 |
|
执行结果:
1 | { |
测试提交数据转换成模型
1 |
|
执行后台打印:
1 | {"crateTime":"2016-12-28 08:04:33","deleteEnum":"ENABLE","updateTime":"2016-12-28 08:04:33","id":1,"name":"测试Fastjson","age":11} |
枚举绑定处理
示例中我们看到序列化的枚举为枚举的name(). 如果我们想用枚举的寓意值进行传输过程中的映射时,可以这样做, 透传一个数值, 该数值和枚举在getter()和setter()方法上绑定即可.
修改示例的对象模型
1 | public class ModelTest implements Serializable{ |
我们保持示例中Controller类和测试用例的代码不变,执行用例.
测试对象序列化到前端展示
执行结果
1 | { |
测试提交数据转换成模型
执行后台打印
1 | {"crateTime":"2016-12-28 08:20:17","deleteEnum":"ENABLE","enable":2,"updateTime":"2016-12-28 08:20:17","id":1,"name":"测试Fastjson","age":11} |
修改用例模拟的实体对象, 测试数值到枚举的映射.
1 | ModelTest modelTest = new ModelTest(); |
后台打印输出:
1 | {"crateTime":"2016-12-28 08:21:48","deleteEnum":"DISABLE","enable":1,"updateTime":"2016-12-28 08:21:48","id":1,"name":"测试Fastjson","age":11} |
可以看到enable的值自动和枚举类型映射上.
使用FastJson做对象和JSON之间的转换
对象转换成JSON
1 |
|
执行结果:
1 | {"crateTime":"2016-12-28 08:30:42","deleteEnum":"DISABLE","enable":1,"updateTime":"2016-12-28 08:30:42","id":1,"name":"测试Fastjson","age":11} |
JSON转换成对象
1 |
|
执行结果:
1 | ModelTest{id=1, name='测试Fastjson', age=11, remark='null', crateTime=Wed Dec 28 08:26:42 CST 2016, modifyTime=Wed Dec 28 08:26:42 CST 2016, deleteEnum=DISABLE, enable=1} |
示例中直接打印输出对象,是因为复写了toString()方法.
SpringBean注解扫描组件
Spring中bean注解扫描类ClassPathScanningCandidateComponentProvider
, 该类构造参数如下:
1 | public ClassPathScanningCandidateComponentProvider(boolean useDefaultFilters) { |
类实例化方式构造依赖, 参数意义:
useDefaultFilters: 是否走默认的springBean扫描策略, spring启动时该值默认是为true, 扫描的组件是@Component
environment: 环境变量相关,基于spring.profiles相关配置
扩展自定义类
自己扩展的注解需要被SpringBean注解扫描器扫到的话需要注解上增加@Component
,
自定义注解示例
自定义注解,绑定Spring注解@Component
1 | @Target({ElementType.TYPE}) |
应用自定义注解
在自定义实体类上增加自定义注解
1 | import com.wplus.plugin.htmlplus.anno.bean.VClass; |
使用Spring注解扫描器扫描自定义类
1 | /** |
程序输出
1 | [com.wplus.plugin.htmlplus.demo.Mock] |
SpringResources资源扫描组件
Spring中Resources扫描类GenericApplicationContext
, 对应的资源扫描方法如下:
1 | public Resource getResource(String location) { |
Resources默认资源加载路径String CLASSPATH_URL_PREFIX = "classpath:";
SpringResources资源组件扩展
定义资源加载方法,增加资源后缀匹配过滤
1 | public List<Resource> scanResources(String locationPattern, final List<String> accepts) { |
示例使用Spring资源加载组件,扫描指定路径下的资源模板, 第二个参数用来标识扫描资源结果匹配的过滤,
后缀在接收列表中的资源,会加载到结果集中.
调用示例模拟
1 | public static void main(String[] args) { |
方法通过扫描当前工程下资源模块HTemplate
中的内容,递归遍历,收集后缀为.html结尾的资源文件.
如果要扫描jar包中的资源的话,classpath统配符应为"classpath*:/HTemplate/**"
@Aspect说明
Spring除了支持Schema方式配置AOP,还支持使用@Aspect
注解方式切面声明。Spring默认注解支持关闭,开启配置:
1 | <aop:aspectj-autoproxy/> |
这样Spring就能发现@AspectJ风格的切面并且将切面应用到目标对象。
@Aspect依赖包
1 | <dependency> |
@Aspect示例
定义切面,切入方法调用耗时
1 | import com.alibaba.fastjson.JSON; |
开启@Aspect支持
示例中我们用注解@Component
对自定的Aspect进行了实例化,需要保证注解所在包能被Spring实例注解扫描到。
要使切面在两个容器(spring&springmvc)中都生效,必须两个都必须配置<aop:aspectj-autoproxy/>
开启注解支持.
- Spring容器
1 | <context:annotation-config/> |
- SpringMvc容器
1 | <context:annotation-config/> |