转载自:http://blog.csdn.net/hguisu/article/details/51006252
自动化配置
Spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置。Spring Boot会根据应用中声明的第三方依赖来自动配置Spring 框架,而不需要进行显式的声明。比如当声明了对 HSQLDB 的依赖时,Spring Boot 会自动配置成使用 HSQLDB 进行数据库操作。
Spring Boot 推荐采用基于Java注解的配置方式,而不是传统的XML。只需要在主配置Java类上添加“@EnableAutoConfiguration
”注解就可以启用自动配置。Spring Boot的自动配置功能是没有侵入性的,只是作为一种基本的默认实现。开发人员可以通过定义其他bean来替代自动配置所提供的功能。比如当应用中定义了自己的数据源bean时,自动配置所提供的HSQLDB就不会生效。这给予了开发人员很大的灵活性。既可以快速的创建一个可以立即运行的原型应用,又可以不断的修改和调整以适应应用开发在不同阶段的需要。可能在应用最开始的时候,嵌入式的内存数据库(如HSQLDB)就足够了,在后期则需要换成MySQL等数据库。Spring Boot 使得这样的切换变得很简单。
外部化配置
在应用中管理配置并不是一个容易的任务,尤其是在应用需要部署到多个环境中时。通常会需要为每个环境提供一个对应的属性文件,用来配置各自的数据库连接信息、服务器信息和第三方服务账号等。Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性文件、YAML 文件、环境变量和命令行参数来定义优先级不同的配置值。
Spring Boot 所提供的配置优先级顺序比较复杂。按照优先级从高到低的顺序,具体的列表如下所示。
- 命令行参数;
- 通过 System.getProperties() 获取的 Java 系统参数;
- 操作系统环境变量;
- 从java:comp/env得到的JNDI属性;
- 通过RandomValuePropertySource生成的“random.*”属性;
- 应用Jar文件之外的属性文件;
- 应用Jar文件内部的属性文件;
- 在应用配置Java类(包含@Configuration注解的Java类)中通过@PropertySource注解声明的属性文件;
- 通过“SpringApplication.setDefaultProperties”声明的默认属性。
命令行参数
通过java -jar app.jar --name="Spring" --server.port=9090
方式来传递参数。
SpringApplication 类默认会把以“–”开头的命令行参数转化成应用中可以使用的配置参数,如 “--name=Alex
”会设置配置参数 “name”的值为 “Alex”。注意:命令行参数在app.jar的后面。
可以通过SpringApplication.setAddCommandLineProperties(false)
禁用命令行配置。
Java系统属性
注意Java系统属性位置java -Dname="isea533" -jar app.jar
,可以配置的属性都是一样的,优先级不同。例如java -Dname="isea533" -jar app.jar --name="Spring
“中name值为Spring。
在运行程序的时候,可以通过参数指定一个外部配置文件。例如: java -jar demo.jar –spring.config.location=/opt/config/application.properties
属性文件
属性文件是最常见的管理配置属性的方式。Spring Boot 提供的 SpringApplication 类会搜索并加载application.properties
或application.yml
文件来获取配置属性值。SpringApplication 类会在下面位置搜索该文件。
- 当前目录的“/config”子目录。
- 当前目录。
- classpath 中的“/config”包。
- classpath
上面的顺序也表示了该位置上包含的属性文件的优先级。优先级按照从高到低的顺序排列。即:/config优先于classpath根目录。
可以通过“spring.config.name
”配置属性来指定不同的属性文件名称,也可以通过“spring.config.location
”来添加额外的属性文件的搜索路径。如果应用中包含多个profile,可以为每个profile定义各自的属性文件,按照“application-{profile}
”来命名。
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)。
app.name=MyApp
app.description=${app.name} is a Spring Boot application
通过如${app.name:默认名称}
方法还可以设置默认值,当找不到引用的属性时,会使用默认的属性。
通过属性占位符还能缩短命令参数,例如修改web默认端口需要使用--server.port=9090
方式,如果在配置中写上:
server.port=${port:8080}
那么就可以使用更短的--port=9090
,当不提供该参数的时候使用默认值8080。
使用配置
由于SpringApplication 类提供了对 YAML 配置文件的支持,只需要添加对 SnakeYAML 的依赖即可。示例使用application.yml来说明。
spring:
profiles: development
db:
url: jdbc:hsqldb:file:testdb
username: sa
password:
@Component
@ConfigurationProperties(prefix="db")
public class DBSettings {
private String url;
private String username;
private String password;
}
通过“@ConfigurationProperties(prefix="db")
”注解,配置属性中以“db”为前缀的属性值会被自动绑定到Java类中同名的域上,只需要在应用的配置类中添加“@EnableConfigurationProperties
”注解就可以启用该自动绑定功能。
@ConfigurationProperties
注解中可以使用locations来指定使用别的配置文件:
@ConfigurationProperties(prefix="db", locations = "classpath:config/other.properties") )