Spring 官方完整文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle

Spring 官方配置文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

参考:https://segmentfault.com/a/1190000014206897

Spring Boot 采用的“默认大于配置”的原则,即使没有配置,也可以使用默认配置正常启动应用。

各种格式的配置文件

默认全局配置文件的文件名是 application,常见的有 application.propertiesapplication.yml(YAML 格式)、application.xml(XML 格式),

application.properties 示例:

server.port=8081

application.yml 示例:

server:
port: 8081

application.xml 示例:

<server>
<port>8081</port>
</server>

类中引入配置文件

要通过 @ConfigurationProperties 注解使用配置文件,需要先 导入依赖,IDEA 会很智能的在自动导入依赖失败时,弹出 Spring 提示的相关文档信息,根据提示操作即可。

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

编写配置文件

server:
port: 8081 person:
name: kika
age: 83
maps:
key1: v1
key2: 2
lists:
- zhangsan
- lisi
- wangwu
birth: 2011/01/01
dog:
name: dd
age: 2

编写 Bean 类读取配置文件

@ConfigurationProperties(prefix = "person") 注解将当前类中的所有属性跟配置文件绑定,可以通过参数 prefix 指定前缀。配置文件的文件名必须是 application,例如 application.yml、application.properties、application-dev.yml 等。对于自定义的配置文件,需要用 @PropertySource 注解指定。

@Component 注解将当前类添加到 Spring 容器中,从而可以使用容器的各种功能。

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Date birth;
private Map<String, Object> maps;
private List<Object> lists;
private Dog dog; @Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
", birth=" + birth +
", maps=" + maps +
", lists=" + lists +
", dog=" + dog +
"}";
}
//... getter/setter 方法

编写单元测试

在 /src/test/java/包名 下面,有 XXApplicationTests 测试类。借助测试类,可以方便的注入。

通过这个测试类来检查刚才的配置是否加载成功:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoQuickApplicationTests { @Autowired
Person person; // 自动关联到这个类 @Test
public void contextLoads() {
System.out.println(person); // 测试输出
}
}

测试文件写完后,右击运行测试类即可执行测试,查看控制台的输出即可。

类中引入配置的某个属性

通过 @ConfigurationProperties 引入整个配置文件,用 @Value 可以引入单个配置。@Value 注解支持3种语法:

  • 字面量,例如 true/false
  • #{SpEL} 表达式,例如 #{3+5}
  • ${key},从环境变量、配置文件中获取值
@Value("${person.name}")
private String name; @Value("#{11+3}")
private Integer age; @Value("true")
private Boolean adult;

对比 @Value 和 @ConfigurationProperties 注解

  • @Value 只能一个个指定值,@ConfigurationProperties 则批量将配置文件中的属性注入类
  • @Value 支持 SpEL 表达式:@Value("#{11+3}")
  • @ConfigurationProperties 支持 JSR303 数据校验,需要引入 @Validated 注解配合,例如:
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
@Email
private String name; // 如果不满足邮箱校验,会报错
//...

@PropertySource 和 @ImportSource 注解

@PropertySource 加载指定的配置文件

如果使用了非全局配置文件,自定义了配置文件的名称,可以用 @PropertySource 注解来加载:


@PropertySource(value ="classpath:person.yml")
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Date birth;
//...

@ImportSource 导入 Spring 的配置文件并生效

通过 XML 向容器添加组件

之前都是用 XML 配置文件向容器中添加组件,有几个步骤,

  • 先写配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helloService" class="com.kikakika.demo_quick.service.HelloService"></bean>
</beans>
  • 然后在代码中通过 @ImportSource 注解引入组件,注意这个注解要加在 Spring Boot 的启动类上:
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class DemoQuickApplication {
public static void main(String[] args) {
SpringApplication.run(DemoQuickApplication.class, args);
}
}
  • 最后,写个测试用例检查一下,执行下面的 testHelloService 方法即可:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoQuickApplicationTests {
@Autowired
ApplicationContext ioc; @Test
public void testHelloService() {
boolean b = ioc.containsBean("helloService");
System.out.println(b);
}
}

@Bean 注解的方式添加组件

Spring Boot 开始,推荐用 @Bean 注解的方式添加组件,用配置类替代配置文件:

package com.kikakika.demo_quick.config;

import com.kikakika.demo_quick.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class MyConfig { // @Bean 注解可以将方法返回值添加到容器中,容器中对应组件的默认ID就是方法名
@Bean
public HelloService helloService() {
System.out.println("success add component");
return new HelloService();
}
}

类写完后,不需要在 Spring Boot 的启动类中引入,Spring 扫描文件后会自动引入,再执行一次上面的测试,可以看到结果。

在配置中使用占位符

Spring Boot 的配置文件中,可以指定占位符,会自动解析,类似格式化输出中的 %d\n 等,语法:

${prefix.key[:default-value]}

例如 ${person.name:zhangsan},系统解析时找不到 person.name 属性时,会自动使用默认值 zhangsan,否则使用找到的属性。

占位符中,有个特殊的随机值 random,可以生成随机的整型、字符串、UUID 等,例如 ${random.int}${random.uuid}

person:
name: kika${random.uuid}
age: ${random.int}
maps:
key1: ${person.age:30}
key2: 2

不同环境使用不同的配置文件

在开发、测试、生产环境的配置文件通常是不同的,有下面几种方式可以指定配置文件:

  • 在配置文件中指定 spring.profiles.active=dev
  • 传入命令行参数:java -jar xx.jar --spring.profiles.active=dev
  • 传入虚拟机参数:-Dspring.profiles.active=dev

单配置文件和多配置文件

一般会将不同环境的配置文档独立,例如:

  • 默认用 application.yml 文件
  • 测试环境使用 application-dev.yml 文件
  • 生产环境使用 application-prod.yml 文件

Spring Boot 会默认加载 application.yml 文件,所以可以在这个文件里指定要激活使用的配置文件,例如下面例子会加载 application-dev.yml 文件:

spring:
profiles:
active: dev

YAML 支持多文档块,如果多个环境的配置写在一个文件中,需要在每个文档块中声明对应的环境:

server:
port: 8081
spring:
profiles:
active: prod --- server:
port: 8082
spring:
profiles: dev --- server:
port: 8083
spring:
profiles: prod

指定配置文件加载位置

Spring Boot 默认支持的配置文件名为 application.properties 和 application.yml,默认会依次扫描的位置包括:

  • file:./config/:当前项目下的 config 目录下,就是 项目目录/config
  • file:./:当前项目根目录下
  • classpath:/config/:类路径的 config 目录下,就是 /src/main/resources/config
  • classpath:/:类路径的 config 目录下,就是 /src/main/resources,默认就在这里

可以通过 spring.config.location 改变默认的配置文件位置。

外部配置的加载顺序

外部配置官方文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

Spring Boot 支持多种外部配置,常见的有(按优先级从高到低排列):

  • 命令行参数,优先级最高,例如 java -jar xx.jar --server.port=8088 --server.context-path=/hello
  • jar 包外部的 appplication-{profile}.properties 或 application.yml(带 spring.profile)配置文件,只要跟 jar 包在同一个目录即可生效
  • jar 包内部的 appplication-{profile}.properties 或 application.yml(带 spring.profile)配置文件
  • jar 包外部的 appplication.properties 或 application.yml(不带 spring.profile)配置文件,只要跟 jar 包在同一个目录即可生效
  • jar 包内部的 appplication.properties 或 application.yml(不带 spring.profile)配置文件

Spring Boot-配置的更多相关文章

  1. Spring Boot -- 配置切换指南

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  2. Spring Boot 配置优先级顺序

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  3. spring boot 配置注入

    spring boot配置注入有变量方式和类方式(参见:<spring boot 自定义配置属性的各种方式>),变量中又要注意静态变量的注入(参见:spring boot 给静态变量注入值 ...

  4. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  5. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

  6. spring boot配置mybatis和事务管理

    spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...

  7. [转] Spring Boot配置多个DataSource

    [From]  https://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000 Sprin ...

  8. Spring boot 配置异步处理执行器

    示例如下: 1. 新建Maven 项目 async-executor 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  9. Spring boot配置404、500页面

    Spring boot 配置404页面很简单,如果你访问的url没有找到就会出现spring boot 提示的页面,很明显Spring boot不用配置就可以显示404页面了. 在template下创 ...

  10. Spring Boot 配置元数据指南

    1. 概览 在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的.但是,记录这些属性的最好方法是什么呢? 在本教程中,我们将探讨 Spring Boot C ...

随机推荐

  1. 接口开发中 遇到的坑——Java byte与C# byte 数据转换问题

    前提: 公司与其他公司进行接口对接 需要使用Byte[]数据流传输数据 原本想法如下:直接IO生成就ok了 using System; using System.IO; using System.Te ...

  2. MySQL 数据库的创建、修改、删除、跳转

    一. 创建数据库 []代表可选项. IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作. <数据库名>:创建数据库的名称.MySQL 的数据存储区 ...

  3. 移动端适配 后篇(rem+vm)

    涉及到的一些名词, 详细解释可参考 移动端适配前篇--移动端适配 rem 名词解释 [英寸Inch]英寸表示屏幕斜对角线的长度 [像素Pixel]像素是图像的基本采样单位,它不是一个确定的物理量,因为 ...

  4. hash_table

    #include <ext/pb_ds/hash_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using name ...

  5. Jenkins打包Maven项目

    Jenkins是一个用于持续集成的服务,简单些说,就是提交代码后,点一下(也可以设置自动检测),系统会自动下载你的代码并编译,然后复制或上传到指定位置,并给所有相关人发送邮件. 一.环境搭建 1.下载 ...

  6. 【NOIP2016提高A组模拟9.9】闭门造车

    题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...

  7. Electron开发使用Vue Devtools

    转自 [https://orchidflower.oschina.io/2017/03/29/Using-Vue-Devtools-in-Electron/] 2.2 安装步骤 首先在Chrome中安 ...

  8. linux-网络管理-6

    Hub 集线器 物理层设备 多端口中继器,不记忆MAC地址 以太网桥 OSI第二层数据链路层 扩展了网络带宽 分割了网络冲突域,使网络冲突被限制在最小的范围内 交换机作为更加智能的交换设备,能够提供更 ...

  9. jquery last 选择器 语法

    jquery last 选择器 语法 作用: :last 选择器选取最后一个元素.最常见的用法:与其他元素一起使用,选取指定组合中的最后一个元素(就像上面的例子). 语法:$(":last& ...

  10. JUnit——Annotation

    Annotation是对属性,方法或者类做一个标记  比如@override表示复写了父类中的方法 [1]@Test: 测试方法(说明该方法为测试方法) a)(expected=XXException ...