习惯优于配置

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. Legend 图例

    1.添加图例 >>> import matplotlib.pyplot as plt >>> import numpy as np >>> x = ...

  2. js常用判断和语法

    1.js获取选中的redio元素 var version = $('.version input[name="input1"]:checked').val();//单选框默认选中& ...

  3. linux rescue 修复引导 与linux下修复windows引导

    在windows有引导的情况下修复linux引导 插入U盘启动 进入rescue模式 fdisk -l 查看分区情况 chroot /mnt/sysimage/ 进入系统 grub-install / ...

  4. python 根据字符串内数字排序

    当我们使用python给一个由字符串组成的列表排序时,常常会排成这样 [‘10a’, ‘11b’, ‘1c’, ‘20d’, ‘21e’, ‘2f’] 这样的形式 ,然而我们想要 [ ‘1c’,‘2f ...

  5. [C#.net]ListBox对Item进行重绘,设置背景色和前景色

    别的不多说了,上代码,直接看 首先设置这行,或者属性窗口设置,这样才可以启动手动绘制,参数有三个 Normal: 自动绘制 OwnerDrawFixed:手动绘制,但间距相同 OwnerDrawVar ...

  6. ABP框架系列之十:(Application-Services-应用服务)

    Application Services are used to expose domain logic to the presentation layer. An Application Servi ...

  7. 10. Halloween 万圣节

    10. Halloween 万圣节 (1) On October the 31st,across Britain and the USA,thousands of children are dress ...

  8. TensorFlow --playground游乐场

    TensorFlow游乐场官网http://playground.tensorflow.org(国内需要梯子才能访问) 游乐场的神经网络结构有三层,第一层为输入层,输入的是特征向量(描述问题特征的向量 ...

  9. Django同步数据库(/manage.py makemigrations) 报错

    新起了环境,创建models.py 内容,想要同步到数据库,执行以下操作时 报错: ./manage.py makemigrations ./manage.py migrate *(第一个步骤为在该项 ...

  10. Oracle DBLINk的使用

    Oracle中自带了DBLink功能,它的作用是将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象,例如我们新建了一个数据database1,我们需要操作 ...