Spring Boot
Posted 小企鹅推雪球!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot相关的知识,希望对你有一定的参考价值。
文章目录
Spring Boot 自动配置简介
- Spring Boot 自动配置功能可以根据不同条件自动决定 Spring 配置中,那些 Bean 该创建,哪些 Bean 不该创建
- Spring Boot 自动配置利用了 Spring 的条件化配置,条件化配置允许配置存在于应用中。但是在满足某些特定条件前会忽略这些配置;只有满足某个条件时,配置才会有效
- 要实现条件化配置我们要用到 @Conditional 注解(位于 org.springframework.context.annotation 包,注意:自 spring 4.0 开始才支持)
- @Conditional 注解的条件是可以在要注册 Bean 定义之前以编程方式确定的任何状态。
- @Conditional 注解可以通过以下任何一种方式使用:
- 作为直接或间接用 @Component 注解的任何类的类级别注释,包括 @Configuration 修饰的类;
- 作为元注释,用于组合自定义注解;
- 作为任何 @Bean 方法上的方法级注释;
Spring Boot入口类
- 程序从main方法开始运行
- 使用SpringApplication.run()加载主程序类
- 主程序类需要标注@SpringBootApplication
- @EnableAutoConfiguration是核心注解;
- @Import导入所有的自动配置场景
- @AutoConfigurationPackage定义默认的包扫描规则
- 程序启动扫描加载主程序类所在的包以及下面所有子包的组件;
Spring Boot配置文件
- Spring Boot使用一个全局的配置文件:application.properties或者application.yml
- 配置文件放在src/main/resources目录或者类路径/config下
- .yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件
- 全局配置文件的可以对一些默认配置值进行修改
配置文件值注入
- @Value和@ConfigurationProperties为属性注值对比
- 属性名匹配规则(Relaxed binding)
- person.firstName:使用标准方式
- person.first-name
- person.first_name
- PERSON_FIRST_NAME:PERSON_FIRST_NAME
- @ConfigurationProperties注解
- 与@Bean结合为属性赋值
- 与@PropertySource(只能用于properties文件)结合读取指定文件
- @ImportResource读取外部配置文件
Spring Boot配置文件占位符
-
RandomValuePropertySource:配置文件中可以使用随机数
$random.value、$random.int、$random.long $random.int(10)、$random.int[1024,65536]
-
属性配置占位符
- 可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
- $app.name:默认值来指定找不到属性时的默认值
Spring Boot Profile
-
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
-
多profile文件形式
- 格式:application-profile.properties
- • application-dev.properties、application-prod.properties
-
多profile文档块模式
spring: profiles: active: prod # profiles.active:激活指定配置 spring: profiles: prod: server: port: 80 --- #三个短横线分割多个profile区(文档块) spring: profiles: default # profiles: default表示未指定默认配置server: port: 8080
-
激活方式:
- 命令行 --spring.profiles.active=dev
- 配置文件 spring.profiles.active=dev
- jvm参数 –Dspring.profiles.active=dev
Spring Boot配置文件加载位置
- spring boot 启动会扫描以下位置的application.properties作为Spring boot的默认配置文件
- file:./config/
- file:./
- classpath:/config/
- classpath:/
- 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。
- 可以通过配置spring.config.location来改变默认配置
Spring Boot外部配置加载顺序
- 命令行参数
- 来自java:comp/env的JNDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
- jar包外部的application-profile.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-profile.properties或application.yml(带spring.profile)配置文件
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
- 通过SpringApplication.setDefaultProperties指定的默认属性
Spring Boot自动配置原理
- 通用模式
- xxxAutoConfiguration:自动配置类
- xxxProperties:属性配置类
- properties文件中能配置的值就来源于[属性配置类]
Spring Boot与日志
-
Spring Boot也能自动适配(jul、log4j2、logback) 并简化配置
-
Spring Boot Log提供以下信息
- 提供以下信息
- 日志级别显示有:INFO,ERROR或WARN
- 进程ID。
- ·
---
是一个分隔符。 - 线程名称括在方括号[]中。
- 线程名称括在方括号[]中。
- 日志消息。
-
Spring Boot Log默认日志消息将打印到控制台窗口。 默认情况下,INFO,ERROR和WARN日志消息将打印在日志文件中。
-
如果必须启用调试级别日志,请使用以下命令在启动应用程序时添加调试标志
java –jar demo.jar --debug
-
将调试模式添加到application.properties 文件中
debug = true
-
在文件中打印日志,则需要在application.properties 文件中设置属性logging.file 或logging.path
-
在文件中打印日志,则需要在application.properties 文件中设置属性logging.file 或logging.path
logging.path = /var/tmp/ 使用下面显示的属性指定自己的日志文件名 - logging.file = /var/tmp/mylog.log 当日志在达到10MB后,自动清理
-
日志级别:Spring Boot支持所有记录器级别,例如:TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF:
在application.properties 文件中定义Root logger
logging.level.root = WARN
Logback不支持“FATAL”级别日志。 它映射到“ERROR”级别日志。
Spring Boot配置Logback
-
Logback支持基于XML的配置来处理Spring Boot Log配置。日志配置详细信息在logback.xml文件中配置。
-
在Logback.xml文件中配置ROOT级别日志
<configuration> <root level = "INFO"> </root> </configuration>
-
给出的Logback.xml文件中配置控制台appender
<configuration> <appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender"></appender> <root level = "INFO"> <appender-ref ref = "STDOUT"/> </root> </configuration>
-
完整的logback.xml文件的代码如下所示
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <contextName>logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“$”来使用变量。 --> <property name="log.path" value="D:/guli_1010/edu" /> <!-- 彩色日志 --> <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 --> <!-- magenta:洋红 --> <!-- boldMagenta:粗红--> <!-- cyan:青色 --> <!-- white:白色 --> <!-- magenta:洋红 --> <property name="CONSOLE_LOG_PATTERN" value="%yellow(%dateyyyy-MM-dd HH:mm:ss) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/> <!--输出到控制台--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <Pattern>$CONSOLE_LOG_PATTERN</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!--输出到文件--> <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>$log.path/log_info.log</file> <!--日志文件输出格式--> <encoder> <pattern>%dyyyy-MM-dd HH:mm:ss.SSS [%thread] %-5level %logger50 - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>$log.path/info/log-info-%dyyyy-MM-dd.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 时间滚动输出 level为 WARN 日志 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>$log.path/log_warn.log</file> <!--日志文件输出格式--> <encoder> <pattern>%dyyyy-MM-dd HH:mm:ss.SSS [%thread] %-5level %logger50 - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>$log.path/warn/log-warn-%dyyyy-MM-dd.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 时间滚动输出 level为 ERROR 日志 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>$log.path/log_error.log</file> <!--日志文件输出格式--> <encoder> <pattern>%dyyyy-MM-dd HH:mm:ss.SSS [%thread] %-5level %logger50 - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>$log.path/error/log-error-%dyyyy-MM-dd.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。 <logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 如果未设置此属性,那么当前logger将会继承上级的级别。 --> <!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作: 第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息 第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别: --> <!--开发环境:打印控制台--> <springProfile name="dev"> <!--可以输出项目中的debug日志,包括mybatis的sql日志--> <logger name="com.guli" level="INFO" /> <!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG 可以包含零个或多个appender元素。 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </springProfile> <!--生产环境:输出到文件--> <springProfile name="pro"> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="ERROR_FILE" /> <appender-ref ref="WARN_FILE" /> </root> </springProfile> </configuration>
以上是关于Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
一张图,理顺 Spring Boot应用在启动阶段执行代码的几种方式
一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式
一张图,理顺 Spring Boot应用在启动阶段执行代码的几种方式