系列文章目录 

IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

IDEWA项目实践——mybatis的一些基本原理以及案例

IDEA项目实践——动态SQL、关系映射、注解开发

IDEA项目实践——Spring框架简介,以及IOC注解

IDEA项目实践——Spring当中的切面AOP

IDEA项目实践——Spring集成mybatis、spring当中的事务

IDEA项目实践——JavaWeb简介以及Servlet编程实战

文章目录

系列文章目录 

前言

2 SpringBoot的三种配置文件

2.1. 在构建时自动扩展属性

2.1.1. 使用Maven的自动属性扩展

2.1.2. 使用Gradle的自动属性扩展

2.2. 将SpringApplication的配置外部化

2.3. 改变应用程序的外部属性的位置

2.4. 使用 "简短" 的命令行参数

2.5. 对外部属性使用YAML

2.6. 设置活动的 Spring Profile

2.7. 设置默认配置文件(Profile)名称

2.8. 根据环境改变配置

2.9. 发现外部属性的内置选项

总结


前言

本文主要介绍 SpringBoot的三种配置文件以及相关spring其他属性的简单介绍。

2 SpringBoot的三种配置文件

三种配置文件的优先级是不同的。

properties > yml >yaml

主流的是yml文件

此处单个介绍一下yaml

YAML 是JSON的超集,因此是指定分层配置数据的方便格式。 只要你的classpath上有 SnakeYAML 库,SpringApplication 类就会自动支持YAML作为properties的替代品。

Spring Framework提供了两个方便的类,可以用来加载YAML文档。 YamlPropertiesFactoryBean 将YAML作为 Properties 加载,YamlMapFactoryBean 将YAML作为 Map 加载。

如果你想把YAML加载为Spring的 PropertySource ,你也可以使用 YamlPropertySourceLoader 类。

设置和读取属性和配置设置以及它们与Spring Boot应用程序的互动的主题。

2.1. 在构建时自动扩展属性

与其硬编码一些在项目构建配置中也被指定的属性,不如使用现有的构建配置来自动扩展它们。 这在Maven和Gradle中都可以实现。

2.1.1. 使用Maven的自动属性扩展

你可以通过使用 resource filtering 从Maven项目中自动扩展属性。 如果你使用 spring-boot-starter-parent,你就可以用 @..@ 占位符来引用你的Maven ‘project properties’,如下例所示。

app.encoding=@project.build.sourceEncoding@
 app.java.version=@java.version@

只有生产配置是这样被过滤的(换句话说,在 src/test/resources 上没有应用过滤)。

如果你启用 addResources 标志,spring-boot:run 目标可以直接将 src/main/resources 添加到classpath(用于热重载)。 这样做规避了 resource filtering 和这个功能。 相反,你可以使用 exec:java goal或自定义插件的配置。 更多细节请参见 插件使用页面。

如果你不使用 parent starter,你需要在你的 pom.xml 中的 <build/> 元素内包含以下元素。

<resources>
     <resource>
         <directory>src/main/resources</directory>
         <filtering>true</filtering>
     </resource>
 </resources>

你还需要在 <plugins/> 中包含以下元素。

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-resources-plugin</artifactId>
     <version>2.7</version>
     <configuration>
         <delimiters>
             <delimiter>@</delimiter>
         </delimiters>
         <useDefaultDelimiters>false</useDefaultDelimiters>
     </configuration>
 </plugin>

如果你在配置中使用标准的Spring占位符(如 ${placeholder}),那么 useDefaultDelimiters 属性很重要。 如果该属性没有设置为 false,这些可能会被构建时扩展。

2.1.2. 使用Gradle的自动属性扩展

你可以通过配置Java插件的 processResources task 来自动展开Gradle项目的属性,如下例所示。

tasks.named('processResources') {
     expand(project.properties)
 }

然后你可以通过使用占位符来引用你的Gradle项目的属性,如下面的例子所示。

app.name=${name}
 app.description=${description}

Gradle的 expand 方法使用Groovy的 SimpleTemplateEngine,它可以转换 ${..} 的标记。 ${..} 风格与Spring自己的属性占位符机制相冲突。 要将Spring的属性占位符与自动扩展一起使用,请将Spring的属性占位符转义如下。\${..}.

2.2. 将SpringApplication的配置外部化

SpringApplication 有bean属性setter,所以你可以在创建应用程序时使用其Java API来修改其行为。 另外,你也可以通过在 spring.main.* 中设置属性来外部化配置。 例如,在 application.properties 中,你可以有以下设置。

spring.main.web-application-type=none
 spring.main.banner-mode=off

那么Spring Boot的Banner就不会在启动时被打印出来,而且应用程序也不会启动嵌入式Web服务器。

外部配置中定义的属性覆盖并取代了用Java API指定的值,但 primary sources 是个明显的例外。 primary sources 是提供给 SpringApplication 构造函数的来源。

@SpringBootApplication
 public class MyApplication {
 
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(MyApplication.class);
         application.setBannerMode(Banner.Mode.OFF);
         application.run(args);
     }
 
 }

或者 SpringApplicationBuilder 的 sources(…) 方法。

public class MyApplication {
 
     public static void main(String[] args) {
         new SpringApplicationBuilder()
             .bannerMode(Banner.Mode.OFF)
             .sources(MyApplication.class)
             .run(args);
     }
 
 }

鉴于上述例子,如果我们有以下配置。

spring.main.sources=com.example.MyDatabaseConfig,com.example.MyJmsConfig
 spring.main.banner-mode=console

实际 application 将显示 banner(如配置所覆盖),并使用三个来源的 ApplicationContext。 应用程序的来源是。

  1. MyApplication (来自代码)
  2. MyDatabaseConfig (来自扩展配置)
  3. MyJmsConfig(来自扩展配置)

2.3. 改变应用程序的外部属性的位置

默认情况下,来自不同来源的属性会按照定义的顺序添加到Spring Environment 中(具体顺序见 “Spring Boot特性的” 中的 “features.html” 部分)。

你也可以提供以下System properties(或环境变量)来改变行为。

  • spring.config.name (SPRING_CONFIG_NAME)。默认为应用程序作为文件名的root。
  • spring.config.location (SPRING_CONFIG_LOCATION)。要加载的文件(如classpath资源或URL)。 为该文件设置了一个单独的 Environment 属性源,它可以被system properties、环境变量或命令行覆盖。

无论你在environment中设置了什么,Spring Boot总是按照上述方法加载 application.properties。 默认情况下,如果使用YAML,那么扩展名为 ‘.yml’,‘.yaml’ 的文件也会被添加到列表中。

如果你想了解正在加载的文件的详细信息,你可以将 org.springframework.boot.context.config 的日志级别设置trace

2.4. 使用 "简短" 的命令行参数

有些人喜欢使用(例如)--port=9000 而不是 --server.port=9000 来在命令行上设置配置属性。你可以通过在 application.properties 中使用占位符来启用这种行为,如下面的例子所示。

server.port=${port:8080}

如果你继承了 spring-boot-starter-parent POM, maven-resources-plugins 的默认过滤标记已从 ${*} 改为 @ (即 @maven.token@ 而不是 ${maven.token}),以防止与Spring风格的占位符冲突。如果你直接为 application.properties 启用了 Maven filtering 功能,你可能还想改变默认的过滤 token,使用 其他分隔符

在这种特定情况下,端口绑定在 Heroku 或 Cloud Foundry 这样的PaaS环境中工作。 在这两个平台中,PORT 环境变量是自动设置的,Spring可以与 Environment 属性的大写同义词进行绑定。

2.5. 对外部属性使用YAML

YAML是JSON的超集,因此,它是一种方便的语法,用于以分层格式存储外部属性,如下例所示。

spring:
   application:
     name: "cruncher"
   datasource:
     driver-class-name: "com.mysql.jdbc.Driver"
     url: "jdbc:mysql://localhost/test"
 server:
   port: 9000

创建一个名为 application.yaml 的文件,并将其放在classpath的根目录中。 然后将 snakeyaml 添加到你的依赖项中(Maven 座标 org.yaml:snakeyaml,如果你使用 spring-boot-starter 就已经包含了)。 YAML文件被解析为Java的 Map<String,Object> (就像JSON对象),Spring Boot会将该Map扁平化,使其只有一层,并且有句点分隔的键,就像许多人习惯于使用Java中的 Properties 文件一样。

前面的YAML例子对应于下面的 application.properties 文件。

spring.application.name=cruncher
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.url=jdbc:mysql://localhost/test
 server.port=9000

参见 "Spring Boot特性" 部分的 “features.html” ,了解更多YAML信息。

2.6. 设置活动的 Spring Profile

Spring Environment 有这方面的API,但你通常会设置一个系统属性(spring.profiles.active)或一个操作系统环境变量(SPRING_PROFILES_ACTIVE)。另外,你可以用 -D 参数来启动你的应用程序(记得把它放在main类或jar存档之前),如下所示。

 $ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar

在Spring Boot中,你也可以在 application.properties 中设置活动配置文件,如下例所示。

spring.profiles.active=production

以这种方式设置的值会被系统属性或环境变量设置取代,但不会被 SpringApplicationBuilder.profiles() 方法取代。 因此,后者的Java API可以用来增加配置文件而不改变默认值。

更多信息见 "Spring Boot特性" 部分的 “features.html” 。

2.7. 设置默认配置文件(Profile)名称

默认配置文件是在没有激活配置文件的情况下启用的配置文件。 默认情况下,默认配置文件的名称是 default,但可以使用系统属性(spring.profiles.default)或操作系统环境变量(SPRING_PROFILES_DEFAULT)来改变它。

在Spring Boot中,你也可以在 application.properties 中设置默认的配置文件名称,如下例所示。

spring.profiles.default=dev

更多信息见 "Spring Boot特性" 部分的 “features.html”。

2.8. 根据环境改变配置

Spring Boot支持多文档YAML和Properties文件(详见 features.html),可以根据活动配置文件有条件地激活。

如果一个文档包含 spring.config.activate.on-profile key,那么 profiles 值(逗号分隔的profile列表或profile表达式)被送入 Environment.acceptsProfiles() 方法。如果配置文件表达式匹配,那么该文档就会被包含在最终的合并中(否则就不包含),如下面的例子所示。

server.port=9000
 #---
 spring.config.activate.on-profile=development
 server.port=9001
 #---
 spring.config.activate.on-profile=production
 server.port=0

在前面的例子中,默认的端口是9000。 然而,如果名为 ‘development’ 的 Spring profile 处于活动状态,那么端口是9001。 如果 ‘production’ 处于活动状态,那么端口就是0。

文件是按照遇到的顺序合并的。 后面的值覆盖前面的值。

2.9. 发现外部属性的内置选项

Spring Boot在运行时将来自 application.properties(或 YAML 文件和其他地方)的外部属性绑定到应用程序中。 这里没有(技术上也不可能有)一个单一位置的所有支持属性的详尽列表,因为贡献可能来自你classpath上的其他jar文件。

一个运行中的具有Actuator功能的应用程序有一个 configprops 端点,显示所有通过 @ConfigurationProperties 可用的绑定和可绑定的属性。

附录中包括一个 application.properties 的例子,列出了Spring Boot支持的最常见的属性。确定的列表来自于搜索源代码中的 @ConfigurationProperties 和 @Value 注解,以及偶尔使用的Binder。关于加载属性的确切顺序,请参阅 "features.html"。