Spring Boot

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot相关的知识,希望对你有一定的参考价值。

Spring Boot 自动配置简介

  1. Spring Boot 自动配置功能可以根据不同条件自动决定 Spring 配置中,那些 Bean 该创建,哪些 Bean 不该创建
  2. Spring Boot 自动配置利用了 Spring 的条件化配置,条件化配置允许配置存在于应用中。但是在满足某些特定条件前会忽略这些配置;只有满足某个条件时,配置才会有效
  3. 要实现条件化配置我们要用到 @Conditional 注解(位于 org.springframework.context.annotation 包,注意:自 spring 4.0 开始才支持)
  4. @Conditional 注解的条件是可以在要注册 Bean 定义之前以编程方式确定的任何状态。
  5. @Conditional 注解可以通过以下任何一种方式使用:
    1. 作为直接或间接用 @Component 注解的任何类的类级别注释,包括 @Configuration 修饰的类;
    2. 作为元注释,用于组合自定义注解;
    3. 作为任何 @Bean 方法上的方法级注释;

Spring Boot入口类

  1. 程序从main方法开始运行
  2. 使用SpringApplication.run()加载主程序类
  3. 主程序类需要标注@SpringBootApplication
  4. @EnableAutoConfiguration是核心注解;
  5. @Import导入所有的自动配置场景
  6. @AutoConfigurationPackage定义默认的包扫描规则
  7. 程序启动扫描加载主程序类所在的包以及下面所有子包的组件;

Spring Boot配置文件

  1. Spring Boot使用一个全局的配置文件:application.properties或者application.yml
  2. 配置文件放在src/main/resources目录或者类路径/config下
  3. .yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件
  4. 全局配置文件的可以对一些默认配置值进行修改

配置文件值注入

  1. @Value和@ConfigurationProperties为属性注值对比
  2. 属性名匹配规则(Relaxed binding)
    1. person.firstName:使用标准方式
    2. person.first-name
    3. person.first_name
    4. PERSON_FIRST_NAME:PERSON_FIRST_NAME
  3. @ConfigurationProperties注解
    1. 与@Bean结合为属性赋值
    2. 与@PropertySource(只能用于properties文件)结合读取指定文件
  4. @ImportResource读取外部配置文件

Spring Boot配置文件占位符

  1. RandomValuePropertySource:配置文件中可以使用随机数

    $random.value、$random.int、$random.long
    $random.int(10)、$random.int[1024,65536]
    
  2. 属性配置占位符

    1. 可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
    2. $app.name:默认值来指定找不到属性时的默认值

Spring Boot Profile

  1. Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

  2. 多profile文件形式

    1. 格式:application-profile.properties
    2. • application-dev.properties、application-prod.properties
  3. 多profile文档块模式

    spring:
    	profiles:
    		active: prod # profiles.active:激活指定配置
    spring:
    	profiles: prod:
    server:
    	port: 80
    --- #三个短横线分割多个profile区(文档块)
    spring:
    	profiles: default # profiles: default表示未指定默认配置server:
    port: 8080
    
  4. 激活方式:

    1. 命令行 --spring.profiles.active=dev
    2. 配置文件 spring.profiles.active=dev
    3. jvm参数 –Dspring.profiles.active=dev

Spring Boot配置文件加载位置

  1. spring boot 启动会扫描以下位置的application.properties作为Spring boot的默认配置文件
    1. file:./config/
    2. file:./
    3. classpath:/config/
    4. classpath:/
  2. 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。
  3. 可以通过配置spring.config.location来改变默认配置

Spring Boot外部配置加载顺序

  1. 命令行参数
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的application-profile.properties或application.yml(带spring.profile)配置文件
  7. jar包内部的application-profile.properties或application.yml(带spring.profile)配置文件
  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  10. @Configuration注解类上的@PropertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

Spring Boot自动配置原理

  1. 通用模式
    1. xxxAutoConfiguration:自动配置类
    2. xxxProperties:属性配置类
    3. properties文件中能配置的值就来源于[属性配置类]

Spring Boot与日志

  1. Spring Boot也能自动适配(jul、log4j2、logback) 并简化配置

  2. Spring Boot Log提供以下信息

    1. 提供以下信息
    2. 日志级别显示有:INFO,ERROR或WARN
    3. 进程ID。
    4. ·---是一个分隔符。
    5. 线程名称括在方括号[]中。
    6. 线程名称括在方括号[]中。
    7. 日志消息。
  3. Spring Boot Log默认日志消息将打印到控制台窗口。 默认情况下,INFO,ERROR和WARN日志消息将打印在日志文件中。

  4. 如果必须启用调试级别日志,请使用以下命令在启动应用程序时添加调试标志 java –jar demo.jar --debug

  5. 将调试模式添加到application.properties 文件中debug = true

  6. 在文件中打印日志,则需要在application.properties 文件中设置属性logging.file 或logging.path

  7. 在文件中打印日志,则需要在application.properties 文件中设置属性logging.file 或logging.path

    logging.path = /var/tmp/
    使用下面显示的属性指定自己的日志文件名 -
    logging.file = /var/tmp/mylog.log
    当日志在达到10MB后,自动清理
    
  8. 日志级别:Spring Boot支持所有记录器级别,例如:TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF:

在application.properties 文件中定义Root logger
logging.level.root = WARN
Logback不支持“FATAL”级别日志。 它映射到“ERROR”级别日志。

Spring Boot配置Logback

  1. Logback支持基于XML的配置来处理Spring Boot Log配置。日志配置详细信息在logback.xml文件中配置。

  2. 在Logback.xml文件中配置ROOT级别日志

    <configuration>
       <root level = "INFO">
       </root>
    </configuration>
    
  3. 给出的Logback.xml文件中配置控制台appender

    <configuration>
       <appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender"></appender>
       <root level = "INFO">
          <appender-ref ref = "STDOUT"/> 
       </root>
    </configuration>
    
  4. 完整的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应用在启动阶段执行代码的几种方式

一张图,理顺 Spring Boot应用在启动阶段执行代码的几种方式

Spring Boot部署JAR文件瘦身优化经验分享

带有分页和排序的 Spring Boot JPA 规范 API