【sprig boot】配置详解

一、外部配置

Spring boot 启动时根据导入的依赖jar包进行自动配置,可以在spring-boot-autoconfigure-2.0.4.RELEASE.jar包中查看到Spring支持的所有自动配置,即所谓的习惯!

Spring Boot允许您外部化您的配置,以便您可以在不同的环境中使用相同的应用程序代码。 您可以使用properties文件,YAML文件,环境变量和命令行参数来外部化配置。 可以使用@Value注释将属性值直接注入到您的bean中,该注释可通过Spring环境(Environment)抽象访问,或通过@ConfigurationProperties绑定到结构化对象。

Spring Boot使用非常特别的PropertySource命令,旨在允许合理地覆盖值。属性按以下顺序选择:

  • 在您的HOME目录设置的Devtools全局属性(~/.spring-boot-devtools.properties)。
  • 单元测试中的 @TestPropertySource 注解。
  • 单元测试中的 @SpringBootTest#properties 注解属性
  • 命令行参数。
  • SPRING_APPLICATION_JSON 中的属性值(内嵌JSON嵌入到环境变量或系统属性中)。
  • ServletConfig 初始化参数。
  • ServletContext 初始化参数。
  • 来自 java:comp/env 的JNDI属性。
  • Java系统属性(System.getProperties())。
  • 操作系统环境变量。
  • RandomValuePropertySource,只有随机的属性 random.* 中。
  • jar包外面的 Profile-specific application properties (application- {profile} .properties和YAML变体)
  • jar包内的 Profile-specific application properties (application-{profile}.properties和YAML变体)
  • jar包外的应用属性文件(application.properties和YAML变体)。
  • jar包内的应用属性文件(application.properties和YAML变体)。
  • 在@Configuration上的@PropertySource注解。
  • 默认属性(使用SpringApplication.setDefaultProperties设置)

1.1 入口类和@SpringBootApplication

Spring Boot通常有一个名为*Application的入口类,且入口类有一个main方法,这个main方法就是标志的java应用入口方法。调用main方法就可以启动springboot应用。

@SpringBootApplication是springboot的核心注解,它是一个组合注解

涉及到启动Springboot项目的核心注解:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。

注:@EnableAutoConfiguration可以让SpringBoot根据类路径中的jar包依赖为当前项目进行配置。

SpringBoot会自动扫描@SpringBootApplication所在类的同级包以及下级包里的Bean(若为JPA还会扫描@Entity)。所以一般入口类都会放在包的根目录下。

关闭特定的自动配置

通过@SpringBootApplication注解的参数exclude参数实现:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

1.2 应用程序属性文件

SpringApplication将从以下位置的application.properties(或application.yaml)文件中加载属性,并将它们添加到Spring Environment中:

  • 当前目录的/config子目录
  • 当前目录
  • classpath中/config包
  • classpath root路径

该列表按优先级从高到低排序。

如果您不喜欢application.properties作为配置文件名,可以通过指定一个spring.config.name Spring environment属性来切换到另一个。 您还可以使用spring.config.location环境属性(用逗号分隔的目录位置列表或文件路径)显式引用位置。

$ java -jar myproject.jar --spring.config.name=myproject

注意:

默认的搜索路径 classpath:,classpath:/config,file:,file:config/ 始终会被搜索,不管spring.config.location的值如何。

如果您在spring.config.location中指定了任何文件,则不会考虑这些特定配置application- {profile}.properties(profile-specific)文件的变体。 如果您还想使用指定配置(profile-specific)文件的属性,请使用spring.config.location中的目录。

1.2 导入其他配置类

您不需要将所有的@Configuration放在一个类中。 @Import注解可用于导入其他配置类。 或者,您可以使用@ComponentScan自动扫描所有Spring组件,包括@Configuration类。

1.3 使用XML配置

SpringBoot提倡零配置,即无XML配置,但实际上有些特殊的配置需要使用XML配置。我们可以通过Spring提供的@ImportResource来加载XML配置。

从@Configuration类开始,然后使用的@ImportResource注释来加载XML配置文件。

@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"})

1.4 命令行参数配置:

SpringBoot可以基于jar包运行,打成jar包的程序可以直接通过下面的命令行运行,并修改Tomcat端口号:

java -jar xx.jar --server.port=9090

--后面的内容就是spring boot的配置内容

1.5 第三方配置

除了使用@ConfigurationProperties来注解类,还可以在public @Bean方法中使用它。 当您希望将属性绑定到不受控制的第三方组件时,这可能特别有用。

@ConfigurationProperties(prefix = "bar")
@Bean
public BarComponent barComponent() {
    ...
}

使用 bar 前缀定义的任何属性将以与application.properties对应的属性配置,映射到该BarComponent bean。

1.7 指定配置类加载方式(Profiles)

Spring 配置文件提供了将应用程序配置隔离的方法,使其仅在某些环境中可用。 任何@Component或@Configuration都可以使用@Profile进行标记,以限制其在什么时候加载:

@Configuration
@Profile("production")
public class ProductionConfiguration {

    // ...
}

二、属性配置(以.properties格式为例)

 

2.1 SpringBoot配置文件的方式

SpringBoot使用一个全局的配置文件application.properties或application.yml,配置文件路径:src/main/resource目录下或类路径下的/config下。

注:这两种配置文件的区别是格式不一致,示例均采用.properties格式,但实际上以后的主流应该是以yml为主的。

示例:


#修改端口和与默认路径:
server.port=9090
server.context-path=/helloboot。

2.2 常规属性配置:自定义属性与加载

只需要在application.properties中定义属性,直接在类中使用@Value注入即可。

(1)在application.properties中增加属性:

book.author=huyifei
book.name=xueshanfeihu

(2)在类中获取

@RestController
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class LilinlearnApplication {
    @Value("${book.author}")
    private String author;
    @Value("${book.name}")
    private String name;

    @Autowired
    private Author authora;
    @RequestMapping("/")
    public String index() {
        return "??????" + author + name + "    " + authora.getAge() + "  |  " + authora.getName();
    }
    public static void main(String[] args) {
        new SpringApplicationBuilder(LilinlearnApplication.class)
                .bannerMode(Banner.Mode.OFF)
                .run(args);
    }
}

注意:springboot 中配置类加上注解@Configuration即可使用@Value获取 application.properties中的键值对,但在传统的java配置方式中,首先要在类上使用@propterySource(value={“path”}),加载指定配置源,然后才在属性上使用@value获取值

2.3类型安全的配置(基于properties)

若按照常规属性进行注入,你会发现如果多次复用会出现很多冗余的代码,SpringBoot就为我们提供了方法,使用@ConfigurationProperties将properties属性和一个Bean及其属性关联,从而实现安全配置。

在application.properties上添加:

mail.name=eamil
mial.age=18

在类中,这时我们需要使用prefix 将属性来源文件的位置指定。


@Configuration
@ConfigurationProperties(prefix = "mail")
public class Author {
    private String name;
    private String age;
}

如果使用自定义test.proprotites,需要在类上添加注解@PropertySource(value = "classpath:test.properties")

2.4 参数间的引用:占位符

在application.properties中的各个参数之间也可以直接引用来使用,就像下面的设置:

com.didispace.blog.name=程序猿DD
com.didispace.blog.title=Spring Boot教程
com.didispace.blog.desc=${com.didispace.blog.name}正在努力写《${com.didispace.blog.title}》

2.5 使用随机数

在一些情况下,有些参数我们需要希望它不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。

# 随机字符串
com.didispace.blog.value=${random.value}
# 随机int
com.didispace.blog.number=${random.int}
# 随机long
com.didispace.blog.bignumber=${random.long}
# 随机uuid
my.uuid=${random.uuid}
# 10以内的随机数
com.didispace.blog.test1=${random.int(10)}
# 10-20的随机数
com.didispace.blog.test2=${random.int[10,20]}

2.6日志配置

默认情况下,SpringBoot使用Logback作为日志框架。

配置日志输出路径:

logging.file=D:/mylog/log.log

配置日志文件,格式为logging.level.包名=级别:

logging.level.org.springframework.web=DEBUG

2.7多环境配置

我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。

对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

application-dev.properties:开发环境

application-test.properties:测试环境

application-prod.properties:生产环境

至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。

如:spring.profiles.active=test就会加载application-test.properties配置文件内容

 

总结多环境的配置思路:

application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置

application-{profile}.properties中配置各个环境不同的内容

通过命令行方式去激活不同环境的配置

执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为3333,也就是生产环境的配置(prod)。


三、日志配置

3.1 默认日志

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。

默认的日志输出如下:

2016-04-13 08:23:50.120 INFO 37397 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {4.3.11.Final}

输出内容元素具体如下:

时间日期 — 精确到毫秒

日志级别 — ERROR, WARN, INFO, DEBUG or TRACE

进程ID

分隔符 — --- 标识实际日志的开始

线程名 — 方括号括起来(可能会截断控制台输出)

Logger名 — 通常使用源代码的类名

3.2 添加日志依赖

假如maven依赖中添加了spring-boot-starter-logging:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency

但是呢,实际开发中我们不需要直接添加该依赖。

你会发现spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 logback。

3.3 控制台输出

日志级别从低到高分为:

TRACE < DEBUG INFO WARN ERROR FATAL。

如果设置为 WARN ,则低于 WARN 的信息都不会输出。

Spring Boot中默认配置ERROR、WARN和INFO级别的日志输出到控制台。

您还可以通过启动您的应用程序 --debug 标志来启用“调试”模式(开发的时候推荐开启),以下两种方式皆可:

在运行命令后加入--debug标志,如:$ java -jar springTest.jar --debug

application.properties中配置debug=true,该属性置为true的时候,核心Logger(包含嵌入式容器、hibernate、spring)会输出更多内容,但是你自己应用的日志并不会输出为DEBUG级别。

3.4 多彩输出

如果你的终端支持ANSI,设置彩色输出会让日志更具可读性。通过在application.properties中设置spring.output.ansi.enabled参数来支持。

NEVER:禁用ANSI-colored输出(默认项)

DETECT:会检查终端是否支持ANSI,是的话就采用彩色输出(推荐项)

ALWAYS:总是使用ANSI-colored格式输出,若终端不支持的时候,会有很多干扰信息,不推荐使用

3.5 文件输出

默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。

使用Spring Boot喜欢在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格式等,复杂的场景(区分 info 和 error 的日志、每天产生一个日志文件等)满足不了,只能自定义配置,下面会演示。

如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。

logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log

logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。

如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log

注:二者不能同时使用,如若同时使用,则只有logging.file生效

默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO

3.6 级别控制

所有支持的日志记录系统都可以在Spring环境中设置记录级别(例如在application.properties中) 
格式为:'logging.level.* = LEVEL'

logging.level:日志级别控制前缀,*为包名或Logger名 
LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

举例:

logging.level.com.dudu=DEBUG:com.dudu包下所有class以DEBUG级别输出

logging.level.root=WARN:root日志以WARN级别输出

3.7 自定义日志配置 :第三方

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

Log4j2:log4j2-spring.xml, log4j2.xml

JDK (Java Util Logging):logging.properties

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项(下面会提到)。

默认的命名规则,并且放在 src/main/resources 下面即可

如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,application.yml可以通过logging.config属性指定自定义的名字:

logging.config=classpath:logging-config.xml

虽然一般并不需要改变配置文件的名字,但是如果你想针对不同运行时Profile使用不同的日志配置,这个功能会很有用。

一般不需要这个属性,而是直接在logback-spring.xml中使用springProfile配置,不需要logging.config指定不同环境使用不同配置文件。

定义日志配置:完全自定义标签详解

https://blog.csdn.net/inke88/article/details/75007649

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wonder ZH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值