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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM