一、外部配置
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