1.Spring Boot 核心技能
1.1整合JUnit测试
-
代码测试是开发工作中一个非常重要的环节
-
spring-boot-starter-test依赖会为项目引入相关的测试组件
-
支持多种测试框架:JUnit、AssertJ、Hamcrest 等
-
-
用于测试类的注解
-
@RunWith(SpringRunner.class):使@SpringBootTest 注解生效
-
@SpringBootTest:创建Spring 的 ApplicationContext,并将其注入到测试类中
-
@Before、@Test、@After等
-
1.2读取配置文件
如何获取application.yml(application.properties)中的配置信息 :
user: userName: zhangsan password: 123456 …… ……
1.使用@Value注解
@Component
public class User {
@Value("${user.userName}")
private String userName;
@Value("${user.password}")
private String password;
……
}
2.使用@ConfigurationProperties注解将YAML文件中的属性和Bean的属性进行关联
@Component
@ConfigurationProperties( prefix = "user" )
public class User {
private String userName;
private String password;
public void setUserName(String userName) { …… }
public void setPassword(String password) { …… }
……
}
[注意] 1.需要在Bean 类中为YAML中的属性创建对应的setter方法;2.对于不同实体之间存在属性名相同的情况,在YAML文件中配置属性时,需要添加前缀来区分;
[例如:]
user:
userName: zhangsan
teacher:
userName: lisi
1.3多环境配置
-
在实际的项目开发过程中,往往会有多套运行环境
-
开发环境
-
测试环境
-
生产环境
-
-
在项目开发、测试、上线过程中,开发者需要不断修改项目的配置信息,使得项目的开发及部署很容易出错
-
Spring Boot提供了一种多环境配置的解决方案
-
使用properties文件
-
使用YML文件
1.使用properties文件实现多环境配置
-
-
每个环境都需要有单独的properties文件,以环境名区分:
-
开发环境配置文件:application-dev.properties
-
测试环境配置文件:application-test.properties
注意:在applicaton.properties文件中指定当前环境启用哪个配置文件
例如:spring.profiles.active=test

2.使用YML文件实现多环境配置
只需一个配置文件即可,所有配置信息均放在application.yml中
两套配置信息之间用“---”隔开
通过spring.profiles.active配置当前启用的环境
使用YAML文件实现多环境配置时,也可以采用和properties文件类似的多文件配置的方式
spring: profiles: active: test --- spring: profiles: dev server: port: 8081 --- spring: profiles: test server: port: 8082

1.4Spring Boot 的自动配置
使用Spring Boot开发项目时,很多配置都是Spring Boot默认配置完成的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
为什么Spring Boot 会自动地寻找数据库连接的地址呢?
-
Spring Boot 项目中引入了spring-boot-starter-web 和spring-boot-starter-test 这两个依赖之后,会添加两个与自动配置相关的Jar包
-
两个Jar 包下面都包含名为“spring.factories”的文件
-
打开spring.factories 文件,会看到很多自动配置的类
-
其中包括DataSourceAutoConfiguration自动配置类




-
@Configuration:让一个类成为配置类,拥有与Spring的配置文件相同的功能
-
@ConditionalOnClass:条件注解,是@Conditional的扩展注解
-
若项目中DataSource.classEmbeddedDatabaseType.class同时存在,执行@EnableConfigurationProperties注解的操作
-
-
@EnableConfigurationProperties:为某个类中的属性赋值
-
为DataSourceProperties的属性赋值
-
-
@Import:将某个类的实例引入Spring的IoC容器
注意:
项目中未添加spring-boot-starter-jdbc依赖时,项目中只有DataSource.class,没有EmbeddedDatabaseType.class,不满足执行@EnableConfigurationProperties的条件
引入spring-boot-starter-jdbc依赖之后,由于此依赖中包含EmbeddedDatabaseType.class,满足@EnableConfigurationProperties的操作条件,为DataSourceProperties的属性进行
赋值赋值需要url属性,Spring Boot会去application.yml文件中寻找,未找到故引发异常
常用的条件注解
| @Conditional的扩展注解 | 作用 |
|---|---|
| @ConditionalOnBean | 当容器中存在特定名称的Bean时,创建所修饰类的实例 |
| @ConditionalOnClass | 当Classpath中存在特定名称的Class时,创建所修饰类的实例 |
| @ConditionalOnExpression | 当指定的SpEL表达式为true时,创建所修饰类的实例 |
| @ConditionalOnJava | 当JDK版本满足指定条件时,创建所修饰类的实例 |
| @ConditionalOnJndi | 当指定的JNDI接口至少一个可用时,创建所修饰类的实例 |
| @ConditionalOnMissingBean | 当容器中不存在特定名称的Bean时,创建所修饰类的实例 |
| @ConditionalOnMissingClass | 当Classpath中不存在特定名称的Class时,创建所修饰类的实例 |
| @ConditionalOnProperty | 当配置文件的特定配置项为指定的值时,创建所修饰类的实例 |
| @ConditionalOnResource | 当Classpath中存在指定的文件资源时,创建所修饰类的实例 |
Spring Boot 读取自动配置类:
-
Spring Boot项目启动类上添加的复合注解@SpringBootApplication中包含名为@EnableAutoConfiguration的注解
-
通过@Import 注解引入的AutoConfigurationImportSelector 类会去所有的自动配置包中查找spring.factories 文件,进而加载所有的自动配置类
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import( { AutoConfigurationImportSelector.class } ) public @interface EnableAutoConfiguration { …… }[实现Spring Boot 自动配置的关键在于] 1.@EnableAutoConfiguration 注解开启Spring Boot 的自动配置。2.条件判断注解可以根据项目的当前条件,根据需要进行Bean 的管理和属性的配置。
关闭Spring Boot的自动配置
1.注解方式:
在启动类的@SpringBootApplication 注解上通过配置exclude 属性进行指定,如需关闭多个类的自动配置,可以用逗号隔开。
@SpringBootApplication( exclude={ DataSourceAutoConfiguration.class } )2.配置文件方式
在application.yml配置中
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
1.5 SpirngBoot 整合JSP
1.Spring Boot 默认支持的模板引擎有4 种,分别为FreeMarker、Groovy、Thymeleaf 和Mustache,不包括JSP 模板引擎。
第一步:可以通过引入相关依赖来整合JSP 模板引擎。
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <!-- JSTL 标签库 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!-- tomcat 支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- <scope>provided</scope>--> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>
第二步:在application.yml 文件中配置视图解析器
spring: mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp
第三步:编写控制器和JSP页面,进行访问测试
1.6 使用XML 的配置
-
在Spring Boot 项目中,除了application.yml 文件,一般很少添加其他配置文件
-
但是在实际开发中为了集成其他框架或者配置一些中间件,也会不得不添加XML 配置文件
-
在Spring Boot 项目中,可以使用@ImportResource 注解读取XML 配置文件将
-
@ImportResource 注解标注到启动类上,或者某个配置类上
语法:
配置文件的位置
2.logBack 日志
1.1 LogBack 日志配置
-
LogBack 和Log4j2 都是Log4j 的升级版,LogBack 在性能上比Log4j 更加高效
-
Spring Boot 把LogBack 作为首选的日志记录框架,spring-boot-starter-web 依赖默认包含了LogBack 的相关依赖
-
通过application.yml 文件,可以实现部分日志配置
日志配置项:
| 属性 | 作用 |
|---|---|
| logging.config | 加载指定位置的日志配置文件 |
| logging.file.max-history | 要保留的存档日志文件的最大数目 |
| logging.file.max-size | 日志文件的最大占用空间,单位为M |
| logging.level.* | 设置某个范围下的日志级别,比如logging.level.org.springframework=DEBUG |
| logging.pattern.console | 设置在控制台输出的日志的格式 |
| logging.pattern.dateformat | 设置在控制台输出的日志的日期格式 |
| logging.pattern.file | 定义输出到日志文件的日志格式 |
| logging.pattern.level | 定义日志的输出级别 |
单独日志配置
application.yml 中可以通过logging.config 属性指定自定义日志配置文件的位置
语法:
日志配置文件的位置和名称
注意:1.默认情况下,Spring Boot 项目可以读取resources 资源目录中特定名字的日志配置文件,如:logback-spring.xml、logback.xml。
2.Spring Boot 推荐使用带有-spring 的文件名作为日志配置,即使用logback-spring.xml
示例
<configuration>:配置文件的根元素节点。包含3 个属性
-
scan:当此属性设置为true 时表示如果配置文件发生改变,将被重新加载,反之则不对配置文件是否发生改变进行检测。默认为true
-
scanPeriod:监测日志配置文件是否有修改的时间间隔,默认是1分钟
-
debug:当此属性设置为true 时,将输出LogBack 默认日志信息。默认值为false
<contextName>:日志的上下文名称。用于区分不同程序的日志
<contextName>testLogback</contextName>
<!--输出日志到控制台-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout>
<pattern>
[%-5level]%d - %contextName - %msg%n
</pattern>
</layout>
</appender>
<property>:设置变量值,在日志配置文件中使用。有两个属性:name 和value。定义的变量值可以通过“${}”调用。
<appender>:配置日志输出的策略。有两个属性:name 和class
-
class 用来指定具体采用的输出策略
-
ConsoleAppender 控制台输出策略
-
RollingFileAppender 文件输出策略
-
<root>:设置日志输出级别和采用哪种日志输出策略
-
level 属性,用来指定日志的输出级别
-
<appender-ref>子元素,用来设置日志输出策略
-
可以配置多个<appender>,并指定让这些<appender>同时生效
-
<appender>的子元素
-
<layout>:指定日志格式,在ConsoleAppender 策略中使用
-
<encoder>:指定日志格式,和layout 的格式化方式相同,在RollingFileAppender策略中使用
-
采用RollingFileAppender 策略则必须指定该属性,否则日志将输出不到文件中
常用的日志格式及含义
配置 含义 %d{HH: mm:ss.SSS} 日志输出时间 %thread 输出日志的进程名称 %-5level 日志级别,并且使用5个字符靠左对齐 %logger{36} 日志输出者的名字 %msg 日志的信息内容 %n 换行符
-
< appender>的子元素
-
<filter>:日志过滤器,如可以过滤指定级别的日志等
-
一个<appender>可以有多个过滤器,按照配置顺序执行
-
-
<file>:当输出日志到文件时,指定文件的路径和文件名
-
没有默认值
-
相对路径、绝对路径均可
-
上级目录不存在会自动创建
-
反斜杠\需要转义
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--过滤Error 级别的日志--> <level>ERROR</level> <!--匹配到Error 级别的日志就禁止--> <onMatch>DENY</onMatch> <!--没有匹配到就允许--> <onMismatch>ACCEPT</onMismatch> </filter>
-
< appender>的子元素
<rollingPolicy>:日志输出时的循环策略。常用的循环策略为TimeBasedRollingPolicy
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义把每一天的日志归档到一个文件中,其中用到了property 定义的变量
logback.dir 和logback.projname-->
<fileNamePattern>
${logback.dir}/info.${logback.projname}.%d{yyyy-MM-dd}.log
</fileNamePattern>
<!--只保留最近90 天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
注意:
-
1.maxHistory 的时间单位由fileNamePattern 决定。当fileNamePattern 中的日期精确到天时,maxHistory 的单位即为天;当fileNamePattern中的时间精确到小时,maxHistory 的时间单位为小时
-
2.日期的最小单位为小时
-
3.当fileNamePattern 和file 同时存在时,只有file 会生效
3. 总结

本文详细介绍了SpringBoot的核心技能,包括JUnit测试的整合、配置文件的读取与多环境切换、自动配置原理、整合JSP模板和XML配置,以及LogBack日志配置。
287

被折叠的 条评论
为什么被折叠?



