Spring Boot教程(三) --- 外部化的配置

本篇博客是看了别人的博客然后根据自己的理解整理了出来的笔记,发出来大家交流学习,如果有不足的地方请大家指正,大家也可以直接去源博客那里看,源博客写的真的很好 。

源博客地址:http://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/#ibm-pcon




一、简介:

1.问题起源:

1> 在应用需要部署到多个环境中时。通常会需要为每个环境提供一个对应的属性文件,用来配置各自的数据库连接信息、服务器信息和第三方服务账号等。

2> 通常的应用部署会包含开发、测试和生产等若干个环境。不同的环境之间的配置存在覆盖关系。测试环境中的配置会覆盖开发环境,而生产环境中的配置会覆盖测试环境。

2.解决方案:

1> Spring 框架本身提供了多种的方式来管理配置属性文件。

2> Spring 3.1 之前可以使用 PropertyPlaceholderConfigurer。

3> Spring 3.1 引入了新的环境(Environment)和概要信息(Profile)API,是一种更加灵活的处理不同环境和配置文件的方式。

Spring 这些配置管理方式的问题在于选择太多,让开发人员无所适从,所以Spring Boot提供了第四种解决方法。

4>  Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性文件、YAML 文件、环境变量和命令行参数来定义优先级不同的配置值

3. Spring Boot 所提供的配置优先级顺序比较复杂。

按照优先级从高到低的顺序,具体的列表如下所示:


  1. 命令行参数。
  2. 通过 System.getProperties() 获取的 Java 系统参数。
  3. 操作系统环境变量。
  4. 从 java:comp/env 得到的 JNDI 属性。
  5. 通过 RandomValuePropertySource 生成的“random.*”属性。
  6. 应用 Jar 文件之外的属性文件。
  7. 应用 Jar 文件内部的属性文件。
  8. 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中通过“@PropertySource”注解声明的属性文件。
  9. 通过“SpringApplication.setDefaultProperties”声明的默认属性。


说明:

1> Spring Boot 的这个配置优先级看似复杂,其实是很合理的。比如命令行参数的优先级被设置为最高。这样的好处是可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。


2> SpringApplication 类默认会把以“--”开头的命令行参数转化成应用中可以使用的配置参数,如果不需要这个功能,可以通过 “SpringApplication.setAddCommandLineProperties(false)” 禁用解析命令行参数。
    -----   如 “--name=Alex” 会设置配置参数 “name” 的值为 “Alex”。

3> RandomValuePropertySource 可以用来生成测试所需要的各种不同类型的随机值,从而免去了在代码中生成的麻烦。

4> RandomValuePropertySource 可以生成数字和字符串。数字的类型包含 int 和 long,可以限定数字的大小范围。以“random.”作为前缀的配置属性名称由 RandomValuePropertySource 来生成

清单 3. 使用 RandomValuePropertySource 生成的配置属性
   
   
user.id=${random.value}
user.count=${random.int}
user.max=${random.long}
user.number=${random.int(100)}
user.range=${random.int[100, 1000]}


4. 外部化的配置 --- 属性文件配置


1> Spring Boot 提供的 SpringApplication 类会搜索并加载 application.properties 文件来获取配置属性值。

2> SpringApplication 类会在下面位置搜索该文件。

  • 。当前目录的“/config”子目录。
  • 。当前目录。
  • 。classpath 中的“/config”包。
  • 。classpath

注意:上面的顺序也表示了该位置上包含的属性文件的优先级。优先级按照从高到低的顺序排列。

1> 可以通过“spring.config.name”配置属性来指定不同的属性文件名称。

2> 也可以通过“spring.config.location”来添加额外的属性文件的搜索路径。

3> 如果应用中包含多个 profile,可以为每个 profile 定义各自的属性文件,按照“application-{profile}”来命名。


配置属性:对于配置属性,可以在代码中通过“@Value”来使用,如代码清单 4 所示。

   
   
@RestController
@EnableAutoConfiguration
public class Application {
 
@Value("${name}")
private String name;
 
@RequestMapping("/")
String home() {
return String.format("Hello %s!", name);
}
}
代码清单 4  中,变量 name 的值来自配置属性中的“name”属性。

5.外部化的配置 --- YAML配置

1.相对于属性文件来说,YAML 是一个更好的配置文件格式。
2.SpringApplication 类也提供了对 YAML 配置文件的支持,只需要添加对 SnakeYAML 的依赖即可。

代码清单 5  给出了 application.yml 文件的示例。
   
   
spring:
profiles: development
db:
url: jdbc:hsqldb:file:testdb
username: sa
password:
---
spring:
profiles: test
db:
url: jdbc:mysql://localhost/test
username: test
password: test

代码清单 5  中的 YAML 文件同时给出了 development 和 test 两个不同的 profile 的配置信息,这也是 YAML 文件相对于属性文件的优势之一。

除了使用“@Value”注解绑定配置属性值之外,还可以使用更加灵活的方式。

代码清单 6  给出的是使用 代码清单 5  中的 YAML 文件的 Java 类。

使用:

1> 通过“@ConfigurationProperties(prefix="db")”注解,配置属性中以“db”为前缀的属性值会被自动绑定到 Java 类中同名的域上,如 url 域的值会对应属性“db.url”的值。

2> 只需要在应用的配置类中添加“@EnableConfigurationProperties”注解就可以启用该自动绑定功能。

清单 6. 使用 YAML 文件的 Java 类
   
   
@Component
@ConfigurationProperties(prefix="db")
public class DBSettings {
private String url;
private String username;
private String password;
}

一、简介:

1.问题起源:

1> 在应用需要部署到多个环境中时。通常会需要为每个环境提供一个对应的属性文件,用来配置各自的数据库连接信息、服务器信息和第三方服务账号等。

2> 通常的应用部署会包含开发、测试和生产等若干个环境。不同的环境之间的配置存在覆盖关系。测试环境中的配置会覆盖开发环境,而生产环境中的配置会覆盖测试环境。

2.解决方案:

1> Spring 框架本身提供了多种的方式来管理配置属性文件。

2> Spring 3.1 之前可以使用 PropertyPlaceholderConfigurer。

3> Spring 3.1 引入了新的环境(Environment)和概要信息(Profile)API,是一种更加灵活的处理不同环境和配置文件的方式。

Spring 这些配置管理方式的问题在于选择太多,让开发人员无所适从,所以Spring Boot提供了第四种解决方法。

4>  Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性文件、YAML 文件、环境变量和命令行参数来定义优先级不同的配置值

3. Spring Boot 所提供的配置优先级顺序比较复杂。

按照优先级从高到低的顺序,具体的列表如下所示:


  1. 命令行参数。
  2. 通过 System.getProperties() 获取的 Java 系统参数。
  3. 操作系统环境变量。
  4. 从 java:comp/env 得到的 JNDI 属性。
  5. 通过 RandomValuePropertySource 生成的“random.*”属性。
  6. 应用 Jar 文件之外的属性文件。
  7. 应用 Jar 文件内部的属性文件。
  8. 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中通过“@PropertySource”注解声明的属性文件。
  9. 通过“SpringApplication.setDefaultProperties”声明的默认属性。


说明:

1> Spring Boot 的这个配置优先级看似复杂,其实是很合理的。比如命令行参数的优先级被设置为最高。这样的好处是可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。


2> SpringApplication 类默认会把以“--”开头的命令行参数转化成应用中可以使用的配置参数,如果不需要这个功能,可以通过 “SpringApplication.setAddCommandLineProperties(false)” 禁用解析命令行参数。
    -----   如 “--name=Alex” 会设置配置参数 “name” 的值为 “Alex”。

3> RandomValuePropertySource 可以用来生成测试所需要的各种不同类型的随机值,从而免去了在代码中生成的麻烦。

4> RandomValuePropertySource 可以生成数字和字符串。数字的类型包含 int 和 long,可以限定数字的大小范围。以“random.”作为前缀的配置属性名称由 RandomValuePropertySource 来生成

清单 3. 使用 RandomValuePropertySource 生成的配置属性
    
    
user.id=${random.value}
user.count=${random.int}
user.max=${random.long}
user.number=${random.int(100)}
user.range=${random.int[100, 1000]}


4. 外部化的配置 --- 属性文件配置


1> Spring Boot 提供的 SpringApplication 类会搜索并加载 application.properties 文件来获取配置属性值。

2> SpringApplication 类会在下面位置搜索该文件。

  • 。当前目录的“/config”子目录。
  • 。当前目录。
  • 。classpath 中的“/config”包。
  • 。classpath

注意:上面的顺序也表示了该位置上包含的属性文件的优先级。优先级按照从高到低的顺序排列。

1> 可以通过“spring.config.name”配置属性来指定不同的属性文件名称。

2> 也可以通过“spring.config.location”来添加额外的属性文件的搜索路径。

3> 如果应用中包含多个 profile,可以为每个 profile 定义各自的属性文件,按照“application-{profile}”来命名。


配置属性:对于配置属性,可以在代码中通过“@Value”来使用,如代码清单 4 所示。

    
    
@RestController
@EnableAutoConfiguration
public class Application {
 
@Value("${name}")
private String name;
 
@RequestMapping("/")
String home() {
return String.format("Hello %s!", name);
}
}
代码清单 4  中,变量 name 的值来自配置属性中的“name”属性。

5.外部化的配置 --- YAML配置

1.相对于属性文件来说,YAML 是一个更好的配置文件格式。
2.SpringApplication 类也提供了对 YAML 配置文件的支持,只需要添加对 SnakeYAML 的依赖即可。

代码清单 5  给出了 application.yml 文件的示例。
    
    
spring:
profiles: development
db:
url: jdbc:hsqldb:file:testdb
username: sa
password:
---
spring:
profiles: test
db:
url: jdbc:mysql://localhost/test
username: test
password: test

代码清单 5  中的 YAML 文件同时给出了 development 和 test 两个不同的 profile 的配置信息,这也是 YAML 文件相对于属性文件的优势之一。

除了使用“@Value”注解绑定配置属性值之外,还可以使用更加灵活的方式。

代码清单 6  给出的是使用 代码清单 5  中的 YAML 文件的 Java 类。

使用:

1> 通过“@ConfigurationProperties(prefix="db")”注解,配置属性中以“db”为前缀的属性值会被自动绑定到 Java 类中同名的域上,如 url 域的值会对应属性“db.url”的值。

2> 只需要在应用的配置类中添加“@EnableConfigurationProperties”注解就可以启用该自动绑定功能。

清单 6. 使用 YAML 文件的 Java 类
    
    
@Component
@ConfigurationProperties(prefix="db")
public class DBSettings {
private String url;
private String username;
private String password;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值