SpringBoot实践折腾记(五):⾃定义配置,扩展SpringMVC配置并使⽤
fastjson
专注和简单⼀直是我的秘诀之⼀。
简单可能⽐复杂更难做到:你必须努⼒理清思路,从⽽使其变得简单。
但最终这是值得的,因为⼀旦你做到了,便可以创造奇迹。
——乔布斯
题记
前两天有点忙,没有连续更新,今天接着聊。⾦句⾥⽼乔的话说得多好,但能真正做到的⼈⼜有多少?⾄少就我个⼈⽽⾔,我还远远没有做到这样,只是⼀个在朝着这个⽅向努⼒的⼈,⼒求简明易懂,⽤⼤⽩话让⼈快速的明⽩理解,简单的例⼦上⼿,让使⽤的⼈更多的去实战使⽤扩展,折腾记即是对⾃⼰学习使⽤很好的⼀次总结,对看的⼈也是⼀个参考的⽅法,希望⼤家能够到对⾃⼰有⽤的思路或⽅法。今天主要说的是,继续上⼀章的配置,我们⾃⼰如何⾃定义类型安全的配置,并使⽤⼀个常⽤的⼯具fastjson集成来切⼊,虽然有⾃定义的jackson和gson,折腾记就是要折腾⼀下嘛,不然怎么能打开新思路。
类型安全的配置
在上⼀篇⽂章中,我们有使⽤过直接在application.properties中设置变量,这种⽅式是Spring中常⽤的⽅式,但对Spring Boot来说,既不是安全的,也会因为频繁使⽤@Value来注⼊配置⽽过于繁琐,项⽬中使⽤起来尤其⿇烦,真实项⽬中的变量就不像我演⽰的Demo⾥的只有⼀两⾏了,很多时候都会是⼏⼗⾏上百⾏,所以,Spring Boot中提供了基于类型安全的配置⽅式,通过@ConfigurationProperties 将properties属性和⼀个Bean及其属性关联,从⽽实现类型安全的配置。
实战1:⾃定义的配置通过类似Service的⽅式注⼊是使⽤
项⽬使⽤:boot_properties
1、创建Bean。
// TestInfoSettings.class
@Component
@ConfigurationProperties(//1
prefix ="usetest",
locations ="classpath:config/app.properties"
)
public class TestInfoSettings {
private String name;
private String age;
springboot是啥//省略get、set
}
说明:
1:@ConfigurationProperties加载properties⽂件内的配置,prefix属性指定配置的前缀,例如:usetest.*=string 。locations可以指定⾃定义的⽂件位置,不指定默认使⽤application.properties。
2、在src/main/resources下新增config/app.properties。
usetest.name=mickjoust
usetest.age=18
3、在Controller⾥添加⼀个接⼝调⽤.
//TestController.class
...原有省略
@RequestMapping("/showSetting")
public Object showSetting(){
StringBuffer sb =new StringBuffer();
sb.append("setting name is : ").Name());
sb.append("setting age is : ").Age());
sb.append("all is : ").append(testInfoSettings);
return JsonResp.success(sb);
}
4、启动,设置的数据注⼊进去了。
Spring Boot⾥的Spring MVC配置
⽤惯了Spring MVC,突然⽤Spring Boot反⽽会觉得很不习惯,因为很多配置消失了。简单不是说配置都没有了,⽽是Spring Boot通过某种⽅式帮助你快速的完成了⼀些前期的⼯作,上⼀章⾥说过,Spring Boot的⼀⼤特性就是⾃动配置并采⽤了条件注解@Conditional的⽅式⾃动扫描并开启你配置的功能,⼆是对于MVC⾥的viewResolver、interceptors、静态资源、formatter和converter、HttpMessageConverts、Servlet、Filter、Listener等,Spring Boot使⽤了⼀个叫WebMvcAutoConfiguration和WebMvcProperties的⽂件来进⾏⾃动配置,如图路径下:
接下来我们看看⼀般都有哪些⾃动配置
⾃动配置的静态资源
在原有的Spring MVC的配置,静态资源通常是这样配置的。
<default-servlet-handler />
<resources location="/static/" mapping="/static/**" cache-period="864000"/>
在Spring Boot⾥是在⽅法addResourceHandlers中来定义静态资源的配置的。其实,就是⼀个if-else(有兴趣的同学⾃⾏看看源码),概括起来包含两类:
1、类路径⽂件
把类路径下的/static、/public、/resources和/META-INF/resources⽂件夹下的静态⽂件直接映射为/**来提供访问。
最后,如果我们要修改静态路径的映射并增加缓存时间,只需要在配置⽂件修改static-path-pattern和cache-period:
spring.mvc.static-path-pattern=/static/**
⾄于静态⽂件的存放路径,因为⼀般常⽤的静态⽂件都是放在这⼏个⽬录下的,基本上可以满⾜要求了,如果要⾃定义,修改
⾃动配置Formatter和Converter
搜索Formatter,就能够到addFormatters这个⽅法⾥的定义,我们只需要定义Converter、GenericConverter和Formatter接⼝实现的实现类Bean,就会注册Bean到Spring MVC中了。⽐较简单,不再举例⼦了。
⾃动配置HttpMessageConverters
同理,搜索MessageConverters,会到configureMessageConverters,这个⽅法就是直接添加HttpMessageConverters的Bean,⽽这个Bean是在HttpMessageConvertAutoConfiguration类中定义的,源码如下:
⽐较简单,就是加⼊定义好的converter,其中,默认加载的有以下⼋类:
有同学要问StringHttpMessageConverter为什么有两个,其实只是字符集使⽤了⼀个UTF-8和⼀个ISO-8859-1。还有默认goson的convert为啥没有看到呢,本章后⾯会说到原因。
##⾃动配置的ViewResolver
同样道理,搜索ViewResolver,会搜索到三个: InternalResourceViewResolver、BeanNameViewResolver、ContentNegotiatingViewResolver。
【1】ContentNegotiatingViewResolver
Spring MVC⾥提供的特殊的ViewResolver,它⾃⼰是不处理View的,它的作⽤是代理给不同的ViewResolver来处理不同的View。源码如下:
【2】InternalResourceViewResolver
这个是内置最常⽤的解析器,通过设置前缀,后缀和controller中⽅法来返回视图名的字符串,以此来得到实际页⾯。源码如下:
它是通过配置⽂件获取前后缀的,设置参数如下:
spring.mvc.view.prefix=
spring.mvc.view.suffix=
【3】BeanNameViewResolver
定义很简单,作⽤就是它会去查Controller⽅法返回值的字符串中是否有定义过的Bean名称,如果有,则⽤定义的View来渲染。
例如:我们定义⼀个Bean叫testView,返回类型是MappingJackson2JsonView,只要在@Controller返回的⽅法中返回,就可以获得指定的视图渲染。
return "testView";
对于视图,这⾥多说⼀句,不同的⼈有不同的喜好和习惯,有的项⽬喜欢直接前后分离,有的项⽬需要返回⼀些视图模板渲染基本的框架,怎么⽤顺⼿怎么⽤,没有好坏优劣之分,只有使⽤的场景不同,⽤得好,视图⼀样能发挥作⽤。
上⾯只是简单说明了⼀些常⽤的⾃动配置,⾄于更多更详细的配置,⼤家抽空可以看看⾃动配置的相关源码,对思路扩展也是有好处的。因为如果只想快速应⽤,通常的常⽤配置已经够⽤了,对于需要⾃定义的应⽤场景⾥,可⾃⾏参看配置修改。
扩展Spring MVC配置
上⾯⼤概介绍了Spring Boot⾥对MVC的⾃动配置,其实,⼤家可以对照着原有MVC的配置查看Spring Boot都有哪些配置项,你会发现其实都是原来已经有的,现在只是换了⼀种⽅式:通过配置或重写⽅法来达到修改或增加Spring MVC的配置。下⾯⽤⼀个例⼦来说明接管Spring Boot的Spring MVC的配置的⽅式并通过修改的⽅式来配置⼀个fastjson的converter。
如何定制Boot⾥的MVC配置?
在⼜需要默认的配置,⼜需要⾃⼰定制的配置的时候,我们需要⾃定义配置,Spring Boot官⽅提供了⼀个适配器类WebMvcConfigurerAdapter来扩展功能。可以通过重写接⼝来⽀持MVC配置。
@Configuration
public class CustomMVCConfiguration extends WebMvcConfigurerAdapter{//1
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
converters.clear();//实验发现,不起作⽤,可能是boot的bug,或者官⽅不让修改?
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters){
for(HttpMessageConverter<?> messageConverter : converters){
System.out.println(messageConverter);//2
}
}
}
说明:
1:继承⽗类,是⼀个适配器模式类,可以重新定义MVC的功能和配置,但不会影响已有配置,属于增加功能扩展,不知道这是好还是不好。
2:到扩展⽅法,可以添加⾃定义⽅法。
实战2:在已有的⾃动功能中增加新的功能fastjson
fastjson,国产,有很多⼈喜欢⽤,因为速度快,操作简单。以前⽼版本时其实也是坑很多啦,不过还是挺好⽤的,⽀持起,现在官⽅版本1.2.12,并没有⽀持Spring Boot的starter,但是它有HttpMessageConvert的⽀持,其实要⽀持也很⽅便。下⾯演⽰⼀下如何集成。
⽅法1:直接注册HttpMessageConverts的Bean
1、⾸先新建⼀个配置⽂件。
//FastJsonHttpMessageConvertersConfiguration .class
@Configuration
@ConditionalOnClass({JSON.class})//1
public class FastJsonHttpMessageConvertersConfiguration {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
FastJsonHttpMessageConverter fastConverter =new FastJsonHttpMessageConverter();//2
FastJsonConfig fastJsonConfig =new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat,
SerializerFeature.WriteClassName
);
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
说明:
1、判断JSON这个类⽂件是否存在,存在才会创建配置。
2、我看官⽅⽂档说的1.2.10以后,会有两个⽅法⽀持HttpMessageconvert,⼀个是FastJsonHttpMessageConverter,⽀持4.2以下的版本,⼀个是FastJsonHttpMessageConverter4⽀持4.2以上的版本,具体有什么区别暂时没有深⼊研究。
2、查看是否注册成功。
成功了。
这个⽅法其实只是注册了Bean,由于没有指定执⾏的配置,使⽤了新⽅法,这种⽅式其实并不好,没办法灵活控制。所以我们看能不能像gson那样指定使⽤,看图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。