20190212 SpringBoot查漏补缺01

01. 排除auto-configuration的类

如果你发现auto-configuration classes 配置了一个你不想使用的类,可以在@EnableAutoConfiguration中禁止它:

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

If the class is not on the classpath, you can use the excludeName attribute of the annotation and specify the fully qualified name instead. Finally, you can also control the list of auto-configuration classes to exclude by using the spring.autoconfigure.exclude property.

如果class不在classpath中, 你可以使用annotation的excludeName 并指定它的全称来代替. 最后, 你也可以通过使用spring.autoconfigure.exclude属性来控制被auto-configuration排除的classes.

02. auto-restart trigger file

当使用spring-boot-devtools时, 你想在特定的时候让程序重启(比如一个文件更新后), 可以使用spring.devtools.restart.trigger-file来配置对应文件.

03. spring-boot-devtools全局设置

你可以在$HOME文件夹下配置一个名为.spring-boot-devtools.properties 的文件作为全局设置,在你的机器上使用devtools的所有Spring Boot应用程序都会应用该文件的属性.例如:

~/.spring-boot-devtools.properties:

spring.devtools.reload.trigger-file=.reloadtrigger

.spring-boot-devtools.properties文件中激活的属性不会影响到profile-specific configuration files

04. Restart Classloader

Spring Boot提供的Restart技术使用了两种类加载器. 没改变的类由 base classloader加载(例如第三方的jar包).你正在开发的类由 restart classloader加载, 当应用程序重新启动时, restart classloader 会被废弃然后创建一个新的. 因为 base classloader 已经可用并且加载好了, 所以这样启动会比 "cold starts"快很多.

05. 日志级别

所有被支持的日志系统都能在Spring Environment中通过logging.level.<logger-name>=<level>进行配置(例如:application.properties), level可以是 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, 或 OFF 中的一个. rrot logger可以使用 logging.level.root来配置.下面的示例展示了application.properties中的一些重要logging设置:

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

06. PropertySource order

Spring Boot为了设计出合理的overriding of values, 使用了非常特别的PropertySource顺序. Properties的优先级由高到低如下所示:

  1. 位于$HOME目录的的Devtools global settings properties(~/.spring-boot-devtools.properties when devtools is active).
  2. 位于单元测试上的@TestPropertySource 注解.
  3. 单元测试的properties attribute. 适用于 @SpringBootTesttest annotations for testing a particular slice of your application.
  4. 命令行参数.
  5. 来自于SPRING_APPLICATION_JSON的properties.
  6. ServletConfig 的初始化参数.
  7. ServletContext的初始化参数.
  8. 来自于java:comp/env的 JNDI attributes.
  9. Java System properties(System.getProperties()).
  10. OS环境变量.
  11. 一个只在random.*拥有properties的 RandomValuePropertySource.
  12. 打包好的jar包外的Profile-specific application properties(application-{profile}.properties 和 YAML variants).
  13. 打包好的jar包内的Profile-specific application properties(application-{profile}.properties 和 YAML variants).
  14. 打包好的jar包外的Application properties(application.properties and YAML variants).
  15. 打包好的jar包内的Application properties(application.properties and YAML variants).
  16. @Configuration 类上的@PropertySource 注解.
  17. 默认properties(通过SpringApplication.setDefaultProperties指定).

为了提供一个具体的例子,假设你正在编写一个将要使用name property的 @Component, 如下面的例子:

import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

在你的application classpath(例如,在jar包里面),你可以有application.properties文件来提供一个name的默认值. 当该程序运行在一个新的环境, 可以在jar包外配置一个新的application.properties文件来复写name. 为了一次独立的测试, 你可以指定命令来加载.(例如:java -jar app.jar --name="Spring").

SPRING_APPLICATION_JSON properties可以通过命令行来提供环境变量.例如,在shell中使用如下命令:

$ SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' java -jar myapp.jar

在上面的例子中, 在Spring Environment 中会有acme.name=test. 你也可以在System property中以spring.application.json的方式提供JSON, 例如:

$ java -Dspring.application.json='{"name":"test"}' -jar myapp.jar.

你也可以通过命令行参数的形式提供JSON, 例如:

$ java -jar myapp.jar --spring.application.json='{"name":"test"}'

你也可以以 JNDI变量的方式提供JSON,例如:java:comp/env/spring.application.json.

07. 访问命令行参数

默认情况下, SpringApplication会将所有命令行参数转换为property并将它们添加到Spring Environment(也就是说以开始的参数,例如--server.port=9000).如前面提到的,命令行参数会优先于任何其他property sources被应用.如果你不想命令行的properties被添加到Environment, 你可以通过SpringApplication.setAddCommandLineProperties(false)来禁用.

08. 应用程序 Propety Files

SpringApplication根据application.properties文件的位置来加载properties,优先级由高到低如下所示:

  1. 当前目录的的/config子目录
  2. 当前目录
  3. classpath的/config
  4. classpath根目录

根据以上优先级, 优先级高的会覆盖掉优先级低的.

09. Relaxed Binding

yaml properties files的属性注入对属性名没那么严格,规则如下例所示:

@ConfigurationProperties(prefix="acme.my-project.person")
public class OwnerProperties {

    private String firstName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

}

Table 24.1. relaxed binding

Property Note
acme.my-project.person.first-name Kebab case, 建议用于.properties.yml文件中.
acme.myProject.person.firstName Standard camel case syntax.
acme.my_project.person.first_name Underscore notation,可用于.properties.yml文件中的另一替换方案.
ACME_MYPROJECT_PERSON_FIRSTNAME Upper case format, 推荐用于使用系统环境变量时.

注解中的prefix值必须使用 kebab case.

Table 24.2. relaxed binding rules per property source

Property Source Simple List
Properties Files Camel case, kebab case, or underscore notation 标准list语法,使用[]或逗号分隔符
YAML Files Camel case, kebab case, or underscore notation 标准 YAML list syntax 或逗号分隔符
Environment Variables 使用下划线作为定界符的大写规则. _ 不应该作为属性名的一部分 数值应该被下划线包围,例如:MY_ACME_1_OTHER = my.acme[1].other
System properties Camel case, kebab case, or underscore notation 标准list语法,使用[]或逗号分隔符

如果可以,推荐使用lower-case kebab来存储属性,例如:my.property-name=acme.

当绑定Map类型的属性时,如果key包含非数字,小写字母或-时,你应该使用括号将其括起. 如果key没被[]括起, 那么它们将会被移除. 例如:

acme:
  map:
    "[/key1]": value1
    "[/key2]": value2
    /key3: value3

绑定的Map对象的key会是/key1, /key2 以及 key3 ,第三个key的/被移除了.

10. 标准YAML syntax

使用-来分隔的list:

acme:
  list:
    - name: my name
      description: my description
    - name: another name
      description: another description

map:

acme:
  map:
    key1:
      name: dev name 1
    key2:
      name: dev name 2
      description: dev description 2
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容