spring boot中的约定优于配置
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或application.yml。
如果在项目中遇到application.properties出现中文乱码的问题,可以改用yaml。出现这个问题是因为Spring Boot总是会以iso-8859的编码方式读取该文件。而且yaml拥有更简洁的语法,因此更推荐使用application.yml作为默认的配置文件。
配置文件中可以定义一个叫做spring.profiles.active的属性,这个属性可以根据运行环境自动读取不同的、额外的配置文件,例如将该属性定义为dev的话,Spring Boot就会额外地从application-dev.properties/application-dev.yml文件中读取该环境的配置。
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中最重要的配置文件就是web.xml,它的主要用途是配置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输出空字符串
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {
@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。也同样可以在配置文件中定义属性,前缀是spring.redis。
"我还是很喜欢你,像雨洒落在热带与极地,不远万里。"
spring boot中的约定优于配置的更多相关文章
- Spring Boot中使用MyBatis注解配置详解(1)
之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...
- spring boot 中logback多环境配置
spring boot 配置logback spring boot自带了log打印功能,使用的是Commons logging 具体可以参考spring boot log 因此,我们只需要在resou ...
- 在Spring Boot中动态实现定时任务配置
原文路径:https://zhuanlan.zhihu.com/p/79644891 在日常的项目开发中,往往会涉及到一些需要做到定时执行的代码,例如自动将超过24小时的未付款的单改为取消状态,自动将 ...
- Spring Boot 中使用 @Transactional 注解配置事务管理
事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...
- Spring Boot中使用@Transactional注解配置事务管理
事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...
- Spring Boot中以代码方式配置Tomcat
在Spring Boot2.0以上配置嵌入式Servlet容器时EmbeddedServletContainerCustomizer类不存在,经网络查询发现被WebServerFactoryCusto ...
- Spring Boot中使用MyBatis注解配置详解
传参方式 下面通过几种不同传参方式来实现前文中实现的插入操作. 使用@Param 在之前的整合示例中我们已经使用了这种最简单的传参方式,如下: @Insert("INSERT INTO US ...
- Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...
- Spring Boot 中 Druid 的监控页面配置
Druid的性能相比HikariCp等其他数据库连接池有一定的差距,但是数据库的相关属性的监控,别的连接池可能还追不上,如图: 今天写一下 Spring Boot 中监控页面的配置,我是直接将seat ...
随机推荐
- java操作elasticsearch实现聚合查询
1.max 最大值 //max 求最大值 @Test public void test30() throws UnknownHostException{ //1.指定es集群 cluster.name ...
- nginx 学习笔记
Nginx是一个自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作 ...
- ASP.NET 应用程序遭遇Server Application Unavailable问题的解决的方法
公司服务器有.NET2的应用在执行,而我使用了.NET4平台开发,本机測试没问题,扔服务器发现要么我的新平台不好使,要么.NET2的旧平台不好使,各种重新启动IIS服务和WWW服务都无济于事 当我意识 ...
- vue数据绑定数组,改变元素时不更新view问题
关于这个问题,官网上说的很清楚官方文档 写个例子HTML<body> <div class="box"> <div v-for="aa i ...
- 鼠标右键打开命令行cmd(管理员身份)
参考:https://blog.csdn.net/bdss58/article/details/54745380 添加到注册表 将下面命令保存为reg文件: Windows Registry Edit ...
- Python装饰器 [1]
装饰器本身是个函数 import time def log(func): def wrapper(*args, **kwargs): start = time.time() result = func ...
- BZOJ3577:玩手机(最大流,二维ST表)
Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接 ...
- 转://Linux大内存页Oracle数据库优化
PC Server发展到今天,在性能方面有着长足的进步.64位的CPU在数年前都已经进入到寻常的家用PC之中,更别说是更高端的PC Server:在Intel和AMD两大处理器巨头的努力下,x86 C ...
- bak
一.基础篇JVMJVM内存结构堆.栈.方法区.直接内存.堆和栈区别Java内存模型内存可见性.重排序.顺序一致性.volatile.锁.final垃圾回收内存分配策略.垃圾收集器(G1).GC算法.G ...
- 解决Nginx+Tomcat下客户端https请求跳转成http的问题
Nginx上开启https, 后端使用Tomcat, 两者间走http协议, 但发现如果tomcat应用存在跳转时, 则客户端浏览器会出现400 Bad Request的错误, 通过抓包发现原因是 ...