SpringBoot框架技术总结
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot框架技术总结相关的知识,希望对你有一定的参考价值。
✍SpringBoot框架技术总结(五)
🔥SpringBoot框架技术总结 | 地址 |
---|---|
🔥SpringBoot框架技术总结(一) | https://blog.csdn.net/Augenstern_QXL/article/details/120802556 |
🔥SpringBoot框架技术总结(二) | https://blog.csdn.net/Augenstern_QXL/article/details/120816431 |
🔥SpringBoot框架技术总结(三) | https://blog.csdn.net/Augenstern_QXL/article/details/120866816 |
🔥SpringBoot框架技术总结(四) | https://blog.csdn.net/Augenstern_QXL/article/details/120866908 |
🔥SpringBoot框架技术总结(五) | https://blog.csdn.net/Augenstern_QXL/article/details/120867244 |
1、SpringBoot核心配置
1.1、全局配置文件
全局配置文件能够对一些默认配置值进行修改。Spring Boot 使用一个 application.properties 或者 application.yaml 的文件作为全局配置文件,该文件存放在 src/main/resource 目录或者类路径的 /config,一般配置文件存放在 resource 目录。
1.2、application.properties
- 使用 Spring Initializr 方式构建 Spring Boot 项目时,会在 resource 目录下自动生成一个空的 application.properties 文件,Spring Boot 项目启动时会自动加载 application.propertie 文件。
- 我们可以在 application.properties 配置文件中定义 Spring Boot 项目的相关属性,该属性可以是系统属性、环境变量、命令参数等信息、也可以是自定义配置文件名称和位置,如下代码所示:
server.address=80
server.port=8080
spring.database.driver-class-name=com.mysql.jdbc.Driver
spring.config.name=application
1.2.1、服务器配置
Springboot 默认启动的是 8080 端口, Web 上下访问路径是 /
,可以通过配置文件 application.properties 来重新配置 springboot
若要更换其他端口,需要在 application.properties 配置文件中重新配置属性 server.port,代码如下:
# 修改tomcat 服务器端口号
server.port = 8090
springboot 默认为应用配置的上下文访问目录是 /
,需要在 application.properties 配置文件中重新配置属性 server.servlet.context-path,代码如下:
#修改应用访问名称
server.servlet.context-path=/springboot
注意:
当 application.properties 与 application.yml 文件在同一目录时,相同的属性配置 application.properties 优先级高于 application.yml
1.3、配置欢迎页面
配置欢迎页面使用 直接实现WebMvcConfigurer
和 直接继承WebMvcConfigurationSupport
这两种方法完成。
1.3.1、实现WebMvcConfigurer接口
添加配置类,实现WebMvcConfigurer
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//可以同时设置多个
//设置访问路径为/,视图名称为login
registry.addViewController("/").setViewName("login");
registry.addViewController("/login.html").setViewName("login");
}
}
其中 addViewController() 方法配置访问路径,setViewName() 方法设置视图名称(与 templates 目录下页面同名),如果模板为 thymeleaf ,则需要在 pom.xml 文件中加入 thymeleaf 模板的依赖代码。默认访问路径可以配置多个
1.4、profile多环境配置
在实际开发环境中,我们存在开发环境的配置,部署环境的配置,测试环境的配置等等,里面的配置信息很多时,例如:端口、上下文路径、数据库配置等等,若每次切换环境时,我们都需要进行修改这些配置信息时,会比较麻烦,profile的出现就是为了解决这个问题。它可以让我们针对不同的环境进行不同的配置,然后可以通过激活、指定参数等方式快速切换环境。
1.4.1、多配置文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本,例如:
- application-test.properties 代表测试环境配置
- application-dev.properties 代表开发环境配置
- application-prod.properties 代表生产环境配置
但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件,我们需要通过一个配置来选择需要激活的环境:
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试
#指定环境
spring.profiles.active=dev
1.4.2、使用步骤
- 创建 profile 配置文件
- 我们可以用application-xxx.yml的命名方式 创建配置文件,其中xxx可以根据自己的需求来定义。
- 我们需要一个测试环境的配置文件,则可以命名为:application-test.yml
- 需要一个生产环境的配置文件,可以命名为:application-prod.yml
- 我们可以不同环境下不同的配置放到对应的profile文件中进行配置。然后把不同环境下都相同的配置放到application.yml文件中配置。
- 激活环境
- 我们可以在 application.yml文件中使用 spring.profiles.active 属性来配置激活哪个环境。
- 也可以使用虚拟机参数来指定激活环境。例如 : -Dspring.profiles.active=test
- 也可以使用命令行参数来激活环境。例如: –spring.profiles.active =test
spring:
profiles:
active: prod
yml 配置文件中如下:
虚拟机参数:Edit Configurations -> Environment -> VM options
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!
1.4.3、yml支持多文档快方式
- 在yml文件中,通过
---
分隔多文档块 - 例如:tomcat默认端口为8080,生产环境下端口号为8090,开发环境下端口号为9090,配置如下
#默认配置
server:
port: 8080
#指定激活环境
spring:
profiles:
active: prod
---
#生产环境
server:
port: 8090
spring:
profiles: prod
---
#开发环境
server:
port: 9090
spring:
profiles: dev
1.5、日志配置
1.5.1、常用的日志框架
- log4j:Apache 的一个开源项目,可以控制日志信息输送的目的地是控制台,文件、GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。虽然已经停止维护了,但是目前绝大部分企业都是使用的 log4j
- LogBack:LogBack 是由 log4j 创始人设计的一个开源日志组件,LogBack当前分成三个模块:logback-core,logback-classic 和logback=access。logback-classic 是 Log4j 的一个改良版本。
- Log4j2:Apache Log4j2 是对Log4j的升级!
1.5.2、SpringBoot日志支持
默认情况下,SpringBoot 默认使用 LogBack 作为日志的实现,不需要对日志做任何配置就可以使用。
- 日志级别,从低到高分为: TRACE < DEBUG < INFO < WARN < ERROR < FATAL
- 但是在logback日志中,日志级别只有5个,从低到高分为:TRACE < DEBUG < INFO < WARN < ERROR
- 低级别的会输出高级别信息,高级别不会输出低级别信息。例如:等级设置为
ERROR
的话,WARN、INFO、DEBUG
的信息是不会输出的。 - 在
SpringBoot
中默认配置了ERROR、WARN、INFO
级别的日志输出到控制台。 Logback中没有FATAL
级别,它会被当做ERROR
来处理
- 默认情况下,INFO 级别以上的信息才会打印到控制台,可以自己设定日志输出级别,需要在 application.properties 配置文件中配置如下代码:
#指定默认级别为info
logging.level.root=info
#设置此包结构下的日志级别为debug级别
logging.level.com.sangeng=debug
- 默认情况下,springboot 不会将日志输出到文件,若想输出到文件,需要加入以下配置
#日志输出到文件
logging.file=my.log
#设置文件输出目录
#设置到项目根目录
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
1.5.3、自定义日志配置
在 application.properties 或 application.yml 全局配置文件中配置日志信息,只能配置一些简单的场景。如果想配置日志的保存路径、日志格式等复杂的场景(如:区分INFO和ERROR级别的日志,每天产生一个新的日志文件等)则无法满足,只能自定义日志信息。
Spring Boot 官方推荐优先使用带有 -spring
的文件名作为日志配置(如使用 logback-spring.xml,而不是 logback.xml),命名为 logback-spring.xml 的日志配置文件,只需要将该配置文件放在项目中的 resources 目录下即可。
如果日志配置文件名称不是以 -spring
结尾(如: logback-config.xml作为配置文件名称),则需要在全局配置文件中通过 loggin.config 属性指定自定义的日志配置文件,代码如下:
logging.config=classpath:logging-config.xml
1.5.4、logback-spring.xml配置文件
LogBack 配置文件是 <configuration>
,该节点有 5 个子节点,分别是 <root>
、<contextName>
、<property>
、<appender>
、<logger>
。根节点包含的属性如下所示:
- scan:当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为 true
- scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔是1分钟。
- debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
<property name="log.path" value="./logs/pmp" />
<!--0. 日志格式和颜色渲染 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--1. 输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--2. 输出到文档-->
<!-- 2.1 level为 DEBUG 日志,时间滚动输出 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_debug.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/web-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.2 level为 INFO 日志,时间滚动输出 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_info.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/web-info-%d{yyyy-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>
<!-- 2.3 level为 WARN 日志,时间滚动输出 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_warn.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/web-warn-%d{yyyy-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>
<!-- 2.4 level为 ERROR 日志,时间滚动输出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_error.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/web-error-%d{yyyy-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,
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
<logger name="org.springframework.web" level="info"/>
<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
-->
<!--
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
【logging.level.org.mybatis=debug logging.level.dao=debug】
-->
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<!-- 4. 最终的策略 -->
<!-- 4.1 开发环境:打印控制台-->
<springProfile name="dev">
<logger name="com.sdcm.pmp" level="debug"/>
</springProfile>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<!-- 4.2 生产环境:输出到文档
<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>
2、YML配置
2.1、YML简介
- SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用
application.properties 或者 application.yml application.yaml )进行配置。 - YAML (YAML Ain’t a Markup Language)YAML不是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,一种专门用来写配置文件的语言。
- YAML 试图用一种比XML更敏捷的方式,来完成XML所完成的任务。
- YAML 主要还是给实体类注入值。
例如:
传统 properties配置:
server.port=8080
server.address=127.0.0.1
传统xml配置:
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
yaml配置:
server:
port: 8080
address: 127.0.0.1
可以看出,YAML 易于人们阅读,更加简洁明了,以数据为核心
2.2、语法
- k: v 表示键值对关系,冒号后面必须有一个空格
- 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
- 大小写敏感
- 缩进时不允许使用Tab键,只允许使用空格。
- java 中对于驼峰命名法,可用原名 或 使 用
-
代替驼峰,如 java 中的 lastName 属性,在 yml 中使用 lastName 或 last-name 都可正确映射。 - yml 中注释前面要加
#
2.3、键值关系
2.3.1、普通值(字面量)
- k:v 字面量直接写就可以,字符串默认不用加上单引号或者双引号
注意:
-
" "
双引号,转义字符能够起作用比如:
name:"sangeng\\n caotang"
,输出: sangeng 换行 caotang -
''
单引号,转义特殊字符不起作用,特殊字符最终只是一个普通的字符串数据比如:
name: 'sangeng\\n caotang'
,输出:sangeng \\n caotang
# 不加单双引号也可以
以上是关于SpringBoot框架技术总结的主要内容,如果未能解决你的问题,请参考以下文章
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段