springboot中的约定优于配置
Spring Boot并不是⼀个全新的框架,⽽是将已有的Spring组件整合起来。
Spring Boot可以说是遵循约定优于配置这个理念产⽣的。它的特点是简单、快速和便捷。
既然遵循约定优于配置,则有⼀些约定是需要去了解的。虽然说Spring Boot基本上舍弃了XML的配置,但是也不是说是零配置,因为约定也是需要配置来⽀持的,只是说减少了⼤量配置。
starter依赖
Spring Boot提供了⼀系列的Starter依赖来简化jar包依赖的配置。
⽐如说spring-boot-starter-web等。
运⾏⽅式
spring-boot-starter-web中包含了Spring MVC的相关依赖(包含Json⽀持的Jackson和数据校验的Hibernate Vaildator)和⼀个内置的Tomcat容器,这使得再开发阶段可以直接通过main⽅法或是Jar包单独运⾏⼀个web项⽬。⽽在部署阶段也可以达成war包放到⽣产环境中运⾏。
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
在拥有@SpringBootApplication注解的类中,使⽤SpringApplication类的run⽅法可以通过Jar启动项⽬。
如果要通过war来启动项⽬,则需要继承SpringBootServletInitializer类并实现configure⽅法,使⽤SrpingApplicationBuilder类实例的sources⽅法启动项⽬。
配置⽂件
Spring Boot提供了两种默认的配置⽂件,是在resources资源⽬录下的application.properties或l。
如果在项⽬中遇到application.properties出现中⽂乱码的问题,可以改⽤yaml。出现这个问题是因为Spring Boot总是会以iso-8859的编码⽅式读取该⽂件。⽽且yaml拥有更简洁的语法,因此更推荐使⽤l作为默认的配置⽂件。
配置⽂件中可以定义⼀个叫做spring.profiles.active的属性,这个属性可以根据运⾏环境⾃动读取不同的、额外的配置⽂件,例如将该属性定义为dev的
话,Spring Boot就会额外地从application-dev.l⽂件中读取该环境的配置。
Spring Boot注⼊配置⽂件属性的⽅法有两种,⼀种是通过@Value注解接受配置⽂件中的属性,另外⼀种是通过@ConfigurationProperties注解通过set⽅法⾃动为Bean注⼊相应的属性。
通过@Value注⼊属性,接收者既可以是⽅法参数,也可以是成员变量。
@Bean
public JedisPool jedisPool(@Value("${redis.host}") String host,
@Value("${redis.port}") int port) {
return new JedisPool(host, port);
}
通过@ConfigurationProperties读取配置初始化Bean,会直接调⽤相应的set⽅法进⾏注⼊。
@Bean(initMethod="init",destroyMethod="close")
@ConfigurationProperties(prefix="dataSource")
public DataSource dataSource() {
return new DruidDataSource();
}
Servlet
Servlet中最重要的配置⽂件就是l,它的主要⽤途是配置Servlet映射和过滤器。⽽在Spring Boot中这将简单很多,只需要将对应的Servlet和Filter定义为Bean即可。
声明⼀个映射根路径的Servlet,例如Spring MVC的DispatcherServlet:
@Bean
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet();
}
需要注意的是,Spring Boot默认会⾃动创建DispatcherServlet的映射。但这是在项⽬中没有⼿动声明其他Servlet Bean的情况下,否则就需要也将这个Bean⼀起声明。
声明⼀个映射特定路径的Servlet,或是需要配置初始化参数的话,则需要使⽤ServletRegistrationBean。
例如Druid的StatViewServlet:
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
return reg;
}
声明过滤器也是如此,例如Spring MVC的CharacterEncodingFilter:
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
复杂⼀点的同样是通过类似的FilterRegistrationBean,例如:
@Bean
public FilterRegistrationBean appFilter() {
FilterRegistrationBean reg = new FilterRegistrationBean();
reg.setFilter(new LoggingFilter());
reg.addUrlPatterns("/api/*");
return reg;
}
Spring MVC
Spring MVC的主要配置都可以通过继承WebMvcConfigurerAdapter(或者WebMvcConfigurationSupport)类进⾏修改,这两个类的主要⽅法有:addFormatters:增加格式化⼯具(⽤于接收参数)
configureMessageConverters:配置消息转换器(⽤于@RequestBody和@ResponseBody)
configurePathMatch:配置路径映射
addArgumentResolvers:配置参数解析器(⽤于接收参数)
addInterceptors:添加
总之⼏乎所有关于Spring MVC的配置都可以在这个类中配置。之后只需要将其设为配置类,即在类上注解@Configuration,Spring Boot就会在运⾏时加载这些配置。
还有⼀些常⽤的Bean默认会⾃动创建,但是可以通过⾃定义进⾏覆盖,例如负责@RequestBody和@RequestBody进⾏转换的
MappingJackson2HttpMessageConverter和ObjectMapper,可以直接这样覆盖掉:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new CustomMappingJackson2HttpMessageConverter();
}
@Bean
public ObjectMapper jsonMapper(){
ObjectMapper objectMapper = new ObjectMapper();
// null输出空字符串
springboot和过滤器 @Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeString(“”);
}
});
return objectMapper;
}
DataSource
如果使⽤了spring-boot-starter-data-jpa,Spring Boot将会⾃动创建⼀个DataSource Bean。可以直接在配置⽂件中定义它的属性,前缀是spring.datasoruce。并且⽆需指定数据库的⽅⾔,这个Bean会⾃动根据项⽬中依赖的数据库驱动判断使⽤的是那种数据库。
同样的,如果使⽤了spring-boot-starter-data-redis,也会创建RedisTemplate、ConnectionFactory等Bean。也同样可以在配置⽂件中定义属性,前缀是
"我还是很喜欢你,像⾬洒落在热带与极地,不远万⾥。"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论