Spring Boot 实战技能

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

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多环境配置

  1. 在实际的项目开发过程中,往往会有多套运行环境

    • 开发环境

    • 测试环境

    • 生产环境

  2. 在项目开发、测试、上线过程中,开发者需要不断修改项目的配置信息,使得项目的开发及部署很容易出错

  3. Spring Boot提供了一种多环境配置的解决方案

    • 使用properties文件

    • 使用YML文件


      1.使用properties文件实现多环境配置

  1. 每个环境都需要有单独的properties文件,以环境名区分:

  2. 开发环境配置文件:application-dev.properties

  3. 测试环境配置文件: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 会自动地寻找数据库连接的地址呢?

  1. Spring Boot 项目中引入了spring-boot-starter-web 和spring-boot-starter-test 这两个依赖之后,会添加两个与自动配置相关的Jar包

  2. 两个Jar 包下面都包含名为“spring.factories”的文件

  3. 打开spring.factories 文件,会看到很多自动配置的类

  4. 其中包括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 读取自动配置类:

  1. Spring Boot项目启动类上添加的复合注解@SpringBootApplication中包含名为@EnableAutoConfiguration的注解

  2. 通过@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. 1.maxHistory 的时间单位由fileNamePattern 决定。当fileNamePattern 中的日期精确到天时,maxHistory 的单位即为天;当fileNamePattern中的时间精确到小时,maxHistory 的时间单位为小时

  2. 2.日期的最小单位为小时

  3. 3.当fileNamePattern 和file 同时存在时,只有file 会生效

3. 总结

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欢乐的阿博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值