Update How-to_ guides.md

master
qibaoguang 2015-03-22 22:23:03 +08:00
parent 0f6d50b358
commit 7d70c907aa
1 changed files with 30 additions and 13 deletions

View File

@ -8,7 +8,7 @@
### Spring Boot应用 ### Spring Boot应用
### 解决自动配置问题 * 解决自动配置问题
Spring Boot自动配置总是尝试尽最大努力去做正确的事但有时候会失败并且很难说出失败原因。 Spring Boot自动配置总是尝试尽最大努力去做正确的事但有时候会失败并且很难说出失败原因。
@ -22,21 +22,21 @@ Spring Boot自动配置总是尝试尽最大努力去做正确的事但有时
- 查看`@Value`注解,它直接绑定到`Environment`。相比`RelaxedEnvironment`这种方式稍微缺乏灵活性但它也允许松散的绑定特别是OS环境变量所以`CAPITALS_AND_UNDERSCORES`是`period.separated`的同义词)。 - 查看`@Value`注解,它直接绑定到`Environment`。相比`RelaxedEnvironment`这种方式稍微缺乏灵活性但它也允许松散的绑定特别是OS环境变量所以`CAPITALS_AND_UNDERSCORES`是`period.separated`的同义词)。
- 查看`@ConditionalOnExpression`注解它根据SpEL表达式的结果来开启或关闭特性通常使用解析自`Environment`的占位符进行计算。 - 查看`@ConditionalOnExpression`注解它根据SpEL表达式的结果来开启或关闭特性通常使用解析自`Environment`的占位符进行计算。
### 启动前自定义Environment或ApplicationContext * 启动前自定义Environment或ApplicationContext
每个`SpringApplication`都有`ApplicationListeners`和`ApplicationContextInitializers`用于自定义上下文context或环境(environment)。Spring Boot从`META-INF/spring.factories`下加载很多这样的内部使用的自定义。有很多方法可以注册其他的自定义: 每个`SpringApplication`都有`ApplicationListeners`和`ApplicationContextInitializers`用于自定义上下文context或环境(environment)。Spring Boot从`META-INF/spring.factories`下加载很多这样的内部使用的自定义。有很多方法可以注册其他的自定义:
* 以编程方式为每个应用注册自定义通过在SpringApplication运行前调用它的`addListeners`和`addInitializers`方法来实现。 1. 以编程方式为每个应用注册自定义通过在SpringApplication运行前调用它的`addListeners`和`addInitializers`方法来实现。
* 以声明方式为每个应用注册自定义,通过设置`context.initializer.classes`或`context.listener.classes`来实现。 2. 以声明方式为每个应用注册自定义,通过设置`context.initializer.classes`或`context.listener.classes`来实现。
* 以声明方式为所有应用注册自定义,通过添加一个`META-INF/spring.factories`并打包成一个jar文件该应用将它作为一个库来实现。 3. 以声明方式为所有应用注册自定义,通过添加一个`META-INF/spring.factories`并打包成一个jar文件该应用将它作为一个库来实现。
`SpringApplication`会给监听器(即使是在上下文被创建之前就存在的)发送一些特定的`ApplicationEvents`,然后也会注册监听`ApplicationContext`发布的事件的监听器。查看Spring Boot特性章节中的[Section 22.4, “Application events and listeners” ](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-events-and-listeners)可以获取一个完整列表。 `SpringApplication`会给监听器(即使是在上下文被创建之前就存在的)发送一些特定的`ApplicationEvents`,然后也会注册监听`ApplicationContext`发布的事件的监听器。查看Spring Boot特性章节中的[Section 22.4, “Application events and listeners” ](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-events-and-listeners)可以获取一个完整列表。
### 构建ApplicationContext层次结构添加父或根上下文 * 构建ApplicationContext层次结构添加父或根上下文
你可以使用`ApplicationBuilder`类创建父/根`ApplicationContext`层次结构。查看'Spring Boot特性'章节的[Section 22.3, “Fluent builder API” ](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-fluent-builder-api)获取更多信息。 你可以使用`ApplicationBuilder`类创建父/根`ApplicationContext`层次结构。查看'Spring Boot特性'章节的[Section 22.3, “Fluent builder API” ](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-fluent-builder-api)获取更多信息。
### 创建一个非webnon-web应用 * 创建一个非webnon-web应用
不是所有的Spring应用都必须是web应用或web服务。如果你想在main方法中执行一些代码但需要启动一个Spring应用去设置需要的底层设施那使用Spring Boot的`SpringApplication`特性可以很容易实现。`SpringApplication`会根据它是否需要一个web应用来改变它的`ApplicationContext`类。首先你需要做的是去掉servlet API依赖如果不能这样做比如基于相同的代码运行两个应用那你可以明确地调用`SpringApplication.setWebEnvironment(false)`或设置`applicationContextClass`属性通过Java API或使用外部配置。你想运行的作为业务逻辑的应用代码可以实现为一个`CommandLineRunner`,并将上下文降级为一个`@Bean`定义。 不是所有的Spring应用都必须是web应用或web服务。如果你想在main方法中执行一些代码但需要启动一个Spring应用去设置需要的底层设施那使用Spring Boot的`SpringApplication`特性可以很容易实现。`SpringApplication`会根据它是否需要一个web应用来改变它的`ApplicationContext`类。首先你需要做的是去掉servlet API依赖如果不能这样做比如基于相同的代码运行两个应用那你可以明确地调用`SpringApplication.setWebEnvironment(false)`或设置`applicationContextClass`属性通过Java API或使用外部配置。你想运行的作为业务逻辑的应用代码可以实现为一个`CommandLineRunner`,并将上下文降级为一个`@Bean`定义。
@ -59,14 +59,14 @@ spring.main.show_banner=false
你也可以提供系统属性(或环境变量)来改变该行为: 你也可以提供系统属性(或环境变量)来改变该行为:
- `spring.config.name``SPRING_CONFIG_NAME`)是根文件名,默认为`application`。 1. `spring.config.name``SPRING_CONFIG_NAME`)是根文件名,默认为`application`。
- `spring.config.location``SPRING_CONFIG_LOCATION`是要加载的文件例如一个classpath资源或一个URL。Spring Boot为该文档设置一个单独的`Environment`属性,它可以被系统属性,环境变量或命令行参数覆盖。 2. `spring.config.location``SPRING_CONFIG_LOCATION`是要加载的文件例如一个classpath资源或一个URL。Spring Boot为该文档设置一个单独的`Environment`属性,它可以被系统属性,环境变量或命令行参数覆盖。
不管你在environment设置什么Spring Boot都将加载上面讨论过的`application.properties`。如果使用YAML那具有'.yml'扩展的文件默认也会被添加到该列表。 不管你在environment设置什么Spring Boot都将加载上面讨论过的`application.properties`。如果使用YAML那具有'.yml'扩展的文件默认也会被添加到该列表。
详情参考[ConfigFileApplicationListener](http://github.com/spring-projects/spring-boot/tree/master/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java) 详情参考[ConfigFileApplicationListener](http://github.com/spring-projects/spring-boot/tree/master/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java)
### 使用'short'命令行参数 * 使用'short'命令行参数
有些人喜欢使用(例如)`--port=9000`代替`--server.port=9000`来设置命令行配置属性。你可以通过在application.properties中使用占位符来启用该功能比如 有些人喜欢使用(例如)`--port=9000`代替`--server.port=9000`来设置命令行配置属性。你可以通过在application.properties中使用占位符来启用该功能比如
```java ```java
@ -76,7 +76,7 @@ server.port=${port:8080}
**注**在这种特殊的情况下端口绑定能够在一个PaaS环境下工作比如Heroku和Cloud Foundry因为在这两个平台中`PORT`环境变量是自动设置的并且Spring能够绑定`Environment`属性的大写同义词。 **注**在这种特殊的情况下端口绑定能够在一个PaaS环境下工作比如Heroku和Cloud Foundry因为在这两个平台中`PORT`环境变量是自动设置的并且Spring能够绑定`Environment`属性的大写同义词。
### 使用YAML配置外部属性 * 使用YAML配置外部属性
YAML是JSON的一个超集可以非常方便的将外部配置以层次结构形式存储起来。比如 YAML是JSON的一个超集可以非常方便的将外部配置以层次结构形式存储起来。比如
```json ```json
@ -99,7 +99,7 @@ server.port=9000
``` ```
查看'Spring Boot特性'章节的[Section 23.6, “Using YAML instead of Properties”](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-yaml)可以获取更多关于YAML的信息。 查看'Spring Boot特性'章节的[Section 23.6, “Using YAML instead of Properties”](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-yaml)可以获取更多关于YAML的信息。
### 设置生效的Spring profiles * 设置生效的Spring profiles
Spring `Environment`有一个API可以设置生效的profiles但通常你会设置一个系统profile`spring.profiles.active`或一个OS环境变量`SPRING_PROFILES_ACTIVE`)。比如,使用一个`-D`参数启动应用程序记着把它放到main类或jar文件之前 Spring `Environment`有一个API可以设置生效的profiles但通常你会设置一个系统profile`spring.profiles.active`或一个OS环境变量`SPRING_PROFILES_ACTIVE`)。比如,使用一个`-D`参数启动应用程序记着把它放到main类或jar文件之前
```shell ```shell
@ -113,7 +113,7 @@ spring.profiles.active=production
想要获取更多信息可查看'Spring Boot特性'章节的[Chapter 24, Profiles](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-profiles)。 想要获取更多信息可查看'Spring Boot特性'章节的[Chapter 24, Profiles](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-profiles)。
### 根据环境改变配置 * 根据环境改变配置
一个YAML文件实际上是一系列以`---`线分割的文档每个文档都被单独解析为一个平坦的flattenedmap。 一个YAML文件实际上是一系列以`---`线分割的文档每个文档都被单独解析为一个平坦的flattenedmap。
@ -143,6 +143,23 @@ YAML文档以它们遇到的顺序合并所以后面的值会覆盖前面的
想要使用profiles文件完成同样的操作你可以使用`application-${profile}.properties`指定特殊的profile相关的值。 想要使用profiles文件完成同样的操作你可以使用`application-${profile}.properties`指定特殊的profile相关的值。
* 发现外部属性的内置选项
Spring Boot在运行时将来自application.properties或.yml的外部属性绑定进一个应用中。在一个地方不可能存在详尽的所有支持属性的列表技术上也是不可能的因为你的classpath下的其他jar文件也能够贡献。
每个运行中且有Actuator特性的应用都会有一个`configprops`端点,它能够展示所有边界和可通过`@ConfigurationProperties`绑定的属性。
附录中包含一个[application.properties](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties)示例它列举了Spring Boot支持的大多数常用属性。获取权威列表可搜索`@ConfigurationProperties`和`@Value`的源码,还有不经常使用的`RelaxedEnvironment`。
### 内嵌的servlet容器