zoukankan      html  css  js  c++  java
  • 窥看 SpringBoot 的原理与使用

    一:SpringBoot的启动

    1. 继承spring-boot-starter-parent项目

    2. 导入spring-boot-dependencies项目依赖

    二:Spring Boot 主类及目录结构介绍

    Spring Boot 与传统项目最大的区别是,传统项目都是打成 WAR 包部署到服务器上面,需要额外的 Servlet 容器, 而 Spring Boot 则可以直接打成 jar 包,并内置集成了 Servlet 容器,通过命令 java -jar xx.jar 则可以直接运行,不需要独立的 Servlet 容器。

    主入口类:

      在主入口类上加上 @SpringBootApplication 注解来开启 Spring Boot 的各项能力,如自动配置、组件扫描等。

    这里要说明一下的就是,@SpringBootApplication是Spring Boot的核心注解,主要组合包含了以下3个注解:

    @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。

    @EnableAutoConfiguration:打开自动配置的功能。

    @ComponentScan:Spring组件扫描。用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。

    如果你不想这么做,你也可以充分利用 @EnableAutoConfiguration 和@ComponentScan 注解自定义你的行为,不过这不是推荐的做法。

    Starter启动器

      Starters包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。

      Spring Boot官方的启动器都是以 spring-boot-starter-命名的,代表了一个特定的应用类型。

    第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的  mybatis-spring-boot-starter

      介绍几种常见的启动器

    启动器名称 功能描述
    spring-boot-starter 包含自动配置、日志、YAML的支持。
    spring-boot-starter-web 使用Spring MVC构建web 工程,包含restful,默认使用Tomcat容器。

    spring-boot-starter-test

     
    spring-boot-starter-actuator 提供生产环境特性,能监控管理应用。
    spring-boot-starter-json 提供对JSON的读写支持。
    spring-boot-starter-logging 默认的日志启动器,默认使用Logback。
       

    三:配置文件

    Spring Boot有两种类型的配置文件,application和bootstrap文件。Spring Boot会自动加载classpath目前下的这两个文件,文件格式为properties或者yml格式。

    application配置文件是应用级别的,是当前应用的配置文件。

    bootstrap配置文件是系统级别的,用来加载外部配置,如配置中心的配置信息,也可以用来定义系统不会变化的属性。bootstatp文件的加载先于application文件。

    开发环境配置(Profile):

    Spring Boot可以对不同环境来读取不同的配置文件。

    假如有开发、测试、生产三个不同的环境,需要定义三个不同环境下的配置。

    建立三个环境下的配置文件(以properties文件为例):

      applcation.properties

      applcation-dev.properties :开发环境

      applcation-test.properties:测试环境

      applcation-prod.properties:生产环境

    然后在applcation.properties文件中指定当前的环境spring.profiles.active=test,这时候读取的就是application-test.properties文件。

    代码中读取配置文件内容:

    读取application文件

    在application.yml或者properties文件中添加:

    info.address=USA
    
    info.company=Spring
    
    info.degree=high
    

     1:使用@Value注解读取方式

    2:使用@ConfigurationProperties注解读取方式

    3:读取指定文件

    如果使用的不是application.yml或者application.properties文件,则可以用  @PropertySource 注解标注,其他还是使用上面两个注解配置

    如:资源目录下建立config/db-config.properties:

    则:

    @PropertySource(value ={"config/db-config.properties"})
    

      注意的是 @PropertySource 不支持 yml 文件读取

    4:加载顺序

    三:Spring Boot Server容器

    参数配置:

    server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数

    spring-boot-starter-web自动携带了tomcat依赖,但也可以替换成jetty和undertow,下面是一个替换jetty的示例。

    <dependency> 
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>   
        <exclusions>   
        <!-- Exclude the Tomcat dependency -->    
            <exclusion>      
                <groupId>org.springframework.boot</groupId>           
                <artifactId>spring-boot-starter-tomcat</artifactId>     
            </exclusion>   
        </exclusions>
    </dependency>
    <!-- Use Jetty instead -->
    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency> 

     启动图案

    banner

    图案定制网站http://patorjk.com

    四:Spring Boot 整合Thymeleaf 模板引擎

    引入依赖

    <dependency> 
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    

     

    查看参数源码:

    private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");
    
    private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");
    
    public static final String DEFAULT_PREFIX = "classpath:/templates/";
    
    public static final String DEFAULT_SUFFIX = ".html";

    默认的编码是:UTF-8

    默认的类型是:text/html

    默认的模板文件目录是:classpath:/templates/

    默认的模板文件后缀是:.html

    这些参数都可以通过在application配置文件中指定 spring.thymeleaf.xx进行更改,更多可参考该参数类。

    使用

    知道了自动配置的原理,所以我们可以知道怎么做了。

    一、在resources目录下创建templates目录。

    二、在templates目录下创建.html模板文件。

    三、使用模板:

    1、模板文件头部使用 <html xmlns:th="http://www.thymeleaf.org"定义。

    2、html标签上使用 th:开头标识作为前缀。

    3、通过 @{}引入web静态文件。

      <link rel="stylesheet" th:href="@{/css/jquery.min.css}"/>

    4、访问数据

    访问springmvc中的model数据: ${user.name},访问更多不同对象的数据请点击参考官方定义。

    六:单元测试

    添加 Maven 依赖

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <version>1.5.10.RELEASE</version>
       <scope>test</scope>
    </dependency>
    

      开发只要使用 spring-boot-starter-test 启动器就能引入以下Spring Boot 测试模块

    spring-boot-test:支持测试的核心内容。

    spring-boot-test-autoconfigure:支持测试的自动化配置。

    还能引入一些其他一些有用的类库,具体如下所示:

    JUnit:Java 应用程序单元测试标准类库。

    Spring Test & Spring Boot Test:Spring Boot 应用程序功能集成化测试支持。

    AssertJ:一个轻量级的断言类库。

    Hamcrest:一个对象匹配器类库。

    Mockito:一个Java Mock测试框架,默认支付 1.x,可以修改为 2.x。

    JSONassert:一个用于JSON的断言库。

    JsonPath:一个JSON操作类库。

    使用

    要让一个普通类变成一个单元测试类只需要在类名上加入 @SpringBootTest 和@RunWith(SpringRunner.class) 两个注释即可。

    在测试方法上加上 @Test 注释。如果测试需要做 REST 调用,可以 @Autowire 一个 TestRestTemplate。

    七:日志集成

    使用starters启动器时,Spring Boot将使用Logback作为默认日志框架。spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。

    既然默认自带了Logback框架,Logback也是最优秀的日志框架,往资源目录下创建一个logback-spring.xml即可,下面是一个参考配置文件。

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 
      3 
      4 <configuration debug="false">
      5 
      6 
      7    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
      8 
      9 
     10    <springProperty scope="context" name="APP_PORT" source="server.port"/>
     11 
     12 
     13    <springProperty scope="context" name="DEFAULT_APP_PORT" source="spring.application.port"/>
     14 
     15 
     16    <property name="OS_NAME" value="${os.name}"/>
     17 
     18 
     19    <if condition='property("OS_NAME").contains("Windows")'>
     20 
     21 
     22        <then>
     23 
     24 
     25            <property name="LOG_PATH" value="${LOG_PATH:-E:/logs}" />
     26 
     27 
     28        </then>
     29 
     30 
     31        <else>
     32 
     33 
     34            <property name="LOG_PATH" value="${LOG_PATH:-/log}" />
     35 
     36 
     37        </else>
     38 
     39 
     40    </if>      
     41 
     42 
     43    <property name="LOG_DIR" value="${APP_NAME:-system}" />
     44 
     45 
     46    <property name="APP_PORT" value="${APP_PORT:-${DEFAULT_APP_PORT:-0}}" />
     47 
     48 
     49    <if condition='!property("APP_PORT").equals("0")'>
     50 
     51 
     52        <then>
     53 
     54 
     55            <property name="LOG_DIR" value="${LOG_DIR}-${APP_PORT}" />
     56 
     57 
     58        </then>
     59 
     60 
     61    </if>
     62 
     63 
     64    <!-- 控制台输出 -->
     65 
     66 
     67    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     68 
     69 
     70        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
     71 
     72 
     73            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符 -->
     74 
     75 
     76            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
     77 
     78 
     79        </encoder>
     80 
     81 
     82    </appender>
     83 
     84 
     85    <!-- 按照每天生成日志文件 -->
     86 
     87 
     88    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
     89 
     90 
     91        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
     92 
     93 
     94            <level>INFO</level>
     95 
     96 
     97        </filter>
     98 
     99 
    100        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    101 
    102 
    103            <!--日志文件输出的文件名 -->
    104 
    105 
    106            <FileNamePattern>${LOG_PATH}/${LOG_DIR}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
    107 
    108 
    109            <!--日志文件保留天数 -->
    110 
    111 
    112            <MaxHistory>30</MaxHistory>
    113 
    114 
    115        </rollingPolicy>
    116 
    117 
    118        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    119 
    120 
    121            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
    122 
    123 
    124            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    125 
    126 
    127        </encoder>
    128 
    129 
    130        <!--日志文件最大的大小 -->
    131 
    132 
    133        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    134 
    135 
    136            <MaxFileSize>10MB</MaxFileSize>
    137 
    138 
    139        </triggeringPolicy>
    140 
    141 
    142    </appender>
    143 
    144 
    145    <!-- 按照每天生成日志文件 error级别 -->
    146 
    147 
    148    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
    149 
    150 
    151        <filter class="ch.qos.logback.classic.filter.LevelFilter">
    152 
    153 
    154            <level>ERROR</level>
    155 
    156 
    157            <onMatch>ACCEPT</onMatch>
    158 
    159 
    160            <onMismatch>DENY</onMismatch>
    161 
    162 
    163        </filter>  
    164 
    165 
    166        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    167 
    168 
    169            <!--日志文件输出的文件名 -->
    170 
    171 
    172            <FileNamePattern>${LOG_PATH}/${LOG_DIR}/error.log.%d{yyyy-MM-dd}.log</FileNamePattern>
    173 
    174 
    175            <!--日志文件保留天数 -->
    176 
    177 
    178            <MaxHistory>30</MaxHistory>
    179 
    180 
    181        </rollingPolicy>
    182 
    183 
    184        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    185 
    186 
    187            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
    188 
    189 
    190            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    191 
    192 
    193        </encoder>
    194 
    195 
    196        <!--日志文件最大的大小 -->
    197 
    198 
    199        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    200 
    201 
    202            <MaxFileSize>10MB</MaxFileSize>
    203 
    204 
    205        </triggeringPolicy>
    206 
    207 
    208    </appender>
    209 
    210 
    211    <!--myibatis log configure -->
    212 
    213 
    214    <logger name="com.apache.ibatis" level="TRACE" />
    215 
    216 
    217    <logger name="java.sql.Connection" level="DEBUG" />
    218 
    219 
    220    <logger name="java.sql.Statement" level="DEBUG" />
    221 
    222 
    223    <logger name="java.sql.PreparedStatement" level="DEBUG" />
    224 
    225 
    226    <!-- 日志输出级别 -->
    227 
    228 
    229    <root level="INFO">
    230 
    231 
    232        <appender-ref ref="STDOUT" />
    233 
    234 
    235        <appender-ref ref="FILE" />
    236 
    237 
    238        <appender-ref ref="FILE-ERROR" />
    239 
    240 
    241    </root>
    242 
    243 
    244 </configuration>
    logback-spring.xml

    八:启动全过程解析

      

    图片来自(https://blog.csdn.net/Growing_stu/article/details/82585817)

  • 相关阅读:
    zoj-3433-Gu Jian Qi Tan
    优先队列详解(转载)
    HDU-3661-Assignments
    hdu-1052-Tian Ji -- The Horse Racing(经典)
    POJ-1456-Supermarket
    UVA-11292Dragon of Loowater
    UVA-11729-Commando War
    循环日程表 问题(递归分治)
    八数码问题
    POJ-3273 Monthly Expense (最大值最小化问题)
  • 原文地址:https://www.cnblogs.com/nullering/p/9943704.html
Copyright © 2011-2022 走看看