Spring Boot 解决方案 - 配置
习惯优于配置
Spring Boot 项目的重要思想就是“习惯优于配置”,这也是为什么该项目诞生的原因,让开发者免于 Spring 生态中各种项目的配置。尽管如此,但项目中完全零配置还是很难做到的,因此本篇文章就来讲解一下 Spring Boot 中的配置。
分析默认项目
先从默认创建的项目开始分析,Spring Boot 默认创建的项目会有一个如下所示的入口类,该类被标注了 @SpringBootApplication
注解,而该注解相当于 @SpringConfiguration
、@EnableAutoConfiguration
和 @ComponentScan
三个的结合,由于前两个注解才和配置有关,所以下面只讲解前两个。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@EnableAutoConfiguration
若标记了 @EnableAutoConfiguration
注解, Spring Boot 会根据 ClassPath 中的 Jar 包依赖来自动配置程序,例如添加了 Web 相关的依赖则会自动进行 Web 配置,且注意官方建议将该注解标记且只标记一次在标有 @Configuration
的类上。
由于自动配置是非侵入性的,因此可以自定义配置来覆盖原有的自动配置,而且还可以禁止某些自动配置类,例如下面例子禁止了数据源的自动配置。
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class DemoConf {
// ...
}
@SpringConfiguration
由源码可知 @SpringConfiguration
是 @Configuration
的别名,而被 @Configuration
标注的类,相当于一个配置文件可进行各种自定义配置,例如下面配置类中注册了一个 Bean 。
@Configuration
public class AppConf {
@Bean
public DemoBean demoBean() {
return new DemoBean();
}
}
属性文件及其优先级
标注 @Configuration
的配置类描述了如何进行配置类似于函数,而属性文件的属性则相当于参数。
默认情况下配置类会按如下列表从高到低的优先级读取属性文件,且默认读取文件名为 application.suffix
的属性文件,其中的 suffix
为 properties
或 yml
其中之一,分别代表支持的两种类型文件。
- 相对打包后程序目录
./config
下 - 打包后程序目录下
- 相对项目资源目录
./config
下 - 项目资源目录下
注意优先级高的属性文件中的相同属性,会覆盖掉优先级低的文件中的属性配置,例如项目资源目录下有如下文件结构,根据上述规则最终获取到的 demo.name
的值就为 foo
。这样的设计可以方便利用外部属性文件改变程序某些配置属性,例如改变绑定端口或者数据库地址。
/resources
|- /config
|- application.properties <- demo.name=foo
|- application.properties <- demo.name=bar
运行时指定属性
除了可用外部属性文件覆盖内部属性文件的属性,还可以在运行程序时指定属性,例如下面命令指定了 demo.name
属性值为 foo
。
java -jar demo.jar --demo.name=foo
当然若是不想运行时指定属性,也可使用 SpringApplication.setAddCommandLineProperties(false)
来禁止读取命令行的属性。
指定属性文件
可利用 @PropertySource
来指定属性文件,例如下面的例子,但注意只支持 properties
和 XML
两种类型的属性文件。
@Configuration
@PropertySource("classpath:/demo.properties") // or @PropertySource("file:/path/demo.xml")
public class AppConf {
// ...
}
虽然不支持 YAML
等其他类型的文件,但可以自己实现 PropertySourceFactory
接口(该特性在 Spring 4.3 中引入),然后如下面的例子在注解中用 factory
指定实现类,具体实现参考这篇文章。
@Configuration
@PropertySource(value="classpath:/demo.yml", factory=YamlPropertySourceFactory.class)
public class AppConf {
// ...
}
多环境的属性文件
对于不同环境,只需要创建名为 application-env.sufix
的属性文件,其中 env
和 suffix
分别为环境名和后缀名,然后在默认的属性文件 application.suffix
中配置属性 spring.profiles.active=env
即可。
例如创建如下的文件目录结构,然后在 application.properties
文件中配置属性 spring.profiles.active=dev
,就可以加载名为 application-dev.properties
的属性文件。
/resources
|- application.properties
|- application-dev.properties
|- application-prod.properties
使用属性
使用 @Value
加 EL 表达式就可以获取属性文件中的属性,例如下面一个简单的例子。
/* application.properties 's content */
// demo.name=foo
@Configuration
public class AppConf {
@Value("${demo.name}")
private String name;
}
@Value
注解不支持批量导入属性,但使用 @ConfigurationProperties
就可以批量导入属性,例如下面的例子。
/* application.properties 's content */
// demo.name=foo
// demo.addr=bar
@Configuration(prefix = "demo") // same as @Configuration("demo")
public class AppConf {
private String name;
private String addr;
// getters and setters
}
除了能批量导入之外,其与 @Value
还有其他区别,具体参考这篇文章。
Spring Boot 解决方案 - 配置的更多相关文章
- 玩转spring boot——properties配置
前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...
- Spring Boot 自动配置之@Conditional的使用
Spring Boot自动配置的"魔法"是如何实现的? 转自-https://sylvanassun.github.io/2018/01/08/2018-01-08-spring_ ...
- Spring Boot 属性配置和使用
Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...
- Spring Boot 属性配置和使用(转)
Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...
- Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置
该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现. Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...
- Springboot 系列(三)Spring Boot 自动配置原理
注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...
- 转:spring boot log4j2配置(使用log4j2.yml文件)---YAML 语言教程
转:spring boot log4j2配置(使用log4j2.yml文件) - CSDN博客http://blog.csdn.net/ClementAD/article/details/514988 ...
- Spring Boot自动配置与Spring 条件化配置
SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
随机推荐
- CentOS Linux下VNC Server远程桌面配置详解
http://www.ha97.com/4634.html PS:偶以前基本不用Linux的远程图形桌面,前几天有开发的同事配置CentOS的vnc有问题,找我解决,就顺便记录总结一下,这个总结是比较 ...
- JVM思考-init和clinit区别
JVM思考-init和clinit区别 目录:JVM总括:目录 clinit和init的区别其实也就是Class对象初始化对象初始化的区别,详情看我上一篇博客: JVM总括四-类加载过程.双亲委派模型 ...
- mysql sql_mode=only_full_group_by错误解析
实测,解决问题; 1.错误提示: 2.检查参数设置: 3.mysql的配置文件my.cnf里面可以修改, 但是,改完以后,你检查所有的参数设置都是对的,就是运行不了.怎么办?怎么办? 4.如果还是不行 ...
- tensorflow学习之(三)Varible 变量的使用
#Varible 变量的使用 使用变量进行自加 import tensorflow as tf state = tf.Variable(0,name='counter') #定义一个变量,赋值为0,且 ...
- Django的学习进阶(一)—— 外键的使用
一.描述 在利用django做网络开发的时候我们会遇到一个问题就是,我们建立了多张数据表,但是多张数据表中的内容是不一样的,但是之间有着联系比如: 我有两张表,一张是记录歌曲信息的内容,一张是对歌曲操 ...
- Codeforces Round #548 (Div. 2) C dp or 排列组合
https://codeforces.com/contest/1139/problem/C 题意 一颗有n个点的树,需要挑选出k个点组成序列(可重复),按照序列的顺序遍历树,假如经过黑色的边,那么这个 ...
- Oracle 异常 中文乱码
环境变量 NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- 跨域访问问题js
您可以通过使用JSONP形式的回调函数来加载其他网域的JSON数据 访问百度的地址解析 返回来省,地区,市 $.getJSON("http://api.map.baidu.com/clou ...
- 描述linux下文件删除的原理
Linux文件删除原理: Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除. 一般来说,每个文件都有2个link计数器:i_count 和 i ...
- Visual Studio中xml文件使用app.config、web.config等的智能提示的方法
在.Net开发的过程中,有时我们需要使用Xml文件作为配置文件(基于某些情况的考虑),而不是app.config.web.config这种,但是我们在xml中配置时希望可以增加类似编辑app.conf ...