您的位置:首页 > 编程语言 > Java开发

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

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

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

一、简介:

1.问题起源:

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

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

2.解决方案:

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

2>Spring3.1之前可以使用PropertyPlaceholderConfigurer。

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

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

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

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

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

命令行参数。

通过System.getProperties()获取的Java系统参数。

操作系统环境变量。

从java:comp/env得到的JNDI属性。

通过RandomValuePropertySource生成的“random.*”属性。

应用Jar文件之外的属性文件。

应用Jar文件内部的属性文件。

在应用配置Java类(包含“@Configuration”注解的Java类)中通过“@PropertySource”注解声明的属性文件。

通过“SpringApplication.setDefaultProperties”声明的默认属性。

说明:

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

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>SpringBoot提供的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
publicclassApplication{
@Value("${name}")
privateStringname;
@RequestMapping("/")
Stringhome(){
returnString.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")
publicclassDBSettings{
privateStringurl;
privateStringusername;
privateStringpassword;
}


一、简介:

1.问题起源:

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

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

2.解决方案:

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

2>Spring3.1之前可以使用PropertyPlaceholderConfigurer。

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

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

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

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

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

命令行参数。

通过System.getProperties()获取的Java系统参数。

操作系统环境变量。

从java:comp/env得到的JNDI属性。

通过RandomValuePropertySource生成的“random.*”属性。

应用Jar文件之外的属性文件。

应用Jar文件内部的属性文件。

在应用配置Java类(包含“@Configuration”注解的Java类)中通过“@PropertySource”注解声明的属性文件。

通过“SpringApplication.setDefaultProperties”声明的默认属性。

说明:

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

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>SpringBoot提供的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
publicclassApplication{
@Value("${name}")
privateStringname;
@RequestMapping("/")
Stringhome(){
returnString.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")
publicclassDBSettings{
privateStringurl;
privateStringusername;
privateStringpassword;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: