这一章接上面的深入理解SpringBoot1:
1, 配置文件占位符,这个是针对.properties文件的,比如:
name=zhangsan${random.uuid}
dog_name=${name:kate}_dog
# 这个意思是如果没有name这个属性,那就用默认的kate
激活配置profile
YMAL 支持多文档块配置profile
server:
port: 8081
spring:
profiles:
active: dev # 这个地方是用来切换的,选择dev表示用8082那个配置文档
# 选择 pro表示用8083那个文档,文档之间用 --- 分开
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: pro
也可以在properties文件中指定,新建一个application-dev.properties
,所有的配置都写在里面,然后怎么使用这里面的配置呢?在application.properties中指定就行了。
spring.profiles.active=dev # 表示激活dev文件
不过为了方便起见,还是用上面的yml多文档的方式,还有命令行模式和虚拟机模式也可以,但是这里就不详细介绍了。
下面说一下,配置文件(application.yml/properties等文件)加载位置的优先级:
优先级从上到下依次减少
file:./config
file:./
classpath:/config/
classpath:/
这里的classpath通常我们指的是resource文件夹,优先级高的配置会覆盖优先级低的配置,而且还有互补配置的特效,也就是高优先的用高优先级,高优先没有的,就用低优先级的配置。
最后,我们在发布的时候,可以通过配置spring.config.location来改变默认的位置,比如最后打包成 xxx.jar,我们在发布的时候,java -jar xxx.jar --spring.config.location="C:/ddd/ddd/lo/application.yml"
的方式进行发布。
下面介绍一下springboot的自动配置原理:这个实在是太难了,还是等以后厉害点再来搞定这个事,视频地址: https://www.bilibili.com/video/av59116536?p=19
下面再来说一下条件判断注解 @Conditional
,它包含了诸如@ConditionalOnMissingBean
这种,比如:
@Bean
@ConditionalOnMissingBean(xx.class)
public xxxx(){
}
它表达的意思是,如果容器中没有xx这个类,就把下面的组件注入到容器中,否则就不注入了。
下面介绍springboot的日志系统:
SpringBoot默认使用日志门面:SLF4j,日志实现是:Logback
如何在系统中使用SLF4j,我们可以在SLF4j官网中找到,下面的代码块:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
当你的系统用到了很多的日志框架,怎么让它们统一起来?看下面:
springboot为我们提供了多个jar包来解决这个问题,都能让我们统一用上slf4j,比如,第一个,如果日志系统用的Commons logging API,我们可以用jcl-over-slf4j.jar
来代替原来common logging的一些依赖,统一用上slf4j。以上都是把原来日志框架剃掉,转成slf4j需要用上的jar。不同的日志框架具体怎么替换,请看这里。
如何让系统中所有的日志框架都统一到slf4j:
- 将系统中其他的日志框架先排除出去
- 用中间包替换原来的日志框架
- 我们导入slf4j其他的实现
怎么排除出去?我们只需要在pom中如下:
<exclusions>
<exclusion>
<groupId>xxxxx</groupId>
<artifactId>xxxxx</artifactId>
</exclusion>
</exclusions>
下面来介绍日志的级别:
@SpringBootTest
class ReviewApplicationTests {
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads2() {
// 日志的级别是从上到下依次增加
/**
* 可以调整日志的级别,日志只会在这个级别以后的高级别生效
*/
logger.trace("这是trace日志");
logger.debug("这是debug日志");
logger.info("这是info日志");
logger.warn("这是wanner日志");
logger.error("这是error日志");
}
这里的级别和注释中写的一样的,我们可以调整日志的级别,一些没必要输出的日志可以直接忽略,SpringBoot默认是只输出info及以上级别的日志。
application.properties中也可以指定,日志级别:
logging.level.com.king=trace # 这是对com.king下所有的类,采用trace级别
logging.file.name=spingboot.log # 这是对输出的日志文件 springboot