习惯优于配置

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 的属性文件,其中的 suffixpropertiesyml 其中之一,分别代表支持的两种类型文件。

  • 相对打包后程序目录 ./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 来指定属性文件,例如下面的例子,但注意只支持 propertiesXML 两种类型的属性文件。

@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 的属性文件,其中 envsuffix 分别为环境名和后缀名,然后在默认的属性文件 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 解决方案 - 配置的更多相关文章

  1. 玩转spring boot——properties配置

    前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...

  2. Spring Boot 自动配置之@Conditional的使用

    Spring Boot自动配置的"魔法"是如何实现的? 转自-https://sylvanassun.github.io/2018/01/08/2018-01-08-spring_ ...

  3. Spring Boot 属性配置和使用

    Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...

  4. Spring Boot 属性配置和使用(转)

    Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...

  5. Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

    该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现.   Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...

  6. Springboot 系列(三)Spring Boot 自动配置原理

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...

  7. 转:spring boot log4j2配置(使用log4j2.yml文件)---YAML 语言教程

    转:spring boot log4j2配置(使用log4j2.yml文件) - CSDN博客http://blog.csdn.net/ClementAD/article/details/514988 ...

  8. Spring Boot自动配置与Spring 条件化配置

    SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...

  9. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

随机推荐

  1. 如何在3GPP下载协议

    以下载AT Commands协议为例. 1. 打开3GPP网址:http://www.3gpp.org/ 2. 打开Specification-Specification Numbering,如图.去 ...

  2. SAS 逻辑库

    SAS逻辑库 SAS逻辑库是一个或多个SAS文件的集合,用于组织.查找和管理 SAS文件.SAS逻辑库管理的SAS文件包括SAS数据集.SAS目录.已编 译的SAS程序,以及多维数据库文件等. 1.逻 ...

  3. 2019.02.16 spoj Query on a tree IV(链分治)

    传送门 题意简述: 捉迷藏强化版(带有边权,可以为负数) 思路:好吧这次我们不用点分树,我们用听起来更屌的链分治. 直接把树剖成若干条重链,这样保证从任意一个点跳到根节点是不会跳超过logloglog ...

  4. ABP框架系列之二:(Entity Framework Core-实体核心框架)

    Introduction(介绍) Abp.EntityFrameworkCore nuget package is used to integrate to Entity Framework (EF) ...

  5. [Solution] JZOJ3470 最短路

    [Solution] JZOJ3470 最短路 题面 Description 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少. ...

  6. modbus转乐鑫物联网平台上传工具

    乐鑫平台推荐个人用户使用 界面比较简洁

  7. 国网电表dlt645-2007抄表软件

    这个支持公网抄表 在以前局域网的基础上做了修正 使用起来更加便利了

  8. InternalResourceViewResolver视图解析器(转)

    转载地址:https://www.cnblogs.com/liruiloveparents/p/5054605.html springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就 ...

  9. 分享《机器学习实战基于Scikit-Learn和TensorFlow》中英文PDF源代码+《深度学习之TensorFlow入门原理与进阶实战》PDF+源代码

    下载:https://pan.baidu.com/s/1qKaDd9PSUUGbBQNB3tkDzw <机器学习实战:基于Scikit-Learn和TensorFlow>高清中文版PDF+ ...

  10. Apollo配置管理系统使用