窺看 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
這裡要說明一下的就是,@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)