1. 程式人生 > >窺看 SpringBoot 的原理與使用

窺看 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)