文章內容使用 Spring Boot 2.x
一、什麼是Spring Boot
Spring Boot是基於Spring開發的,是約定大於配置的核心思想。並且集成了大量的第三方庫配置比如redis、mongoDB、jpa等。Spring Boot就相當於maven整合了所有jar包,Spring Boot整合了所有框架。其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程,並不少什麼新的框架。
二、Spring Boot優點
優點其實就是簡單、快速
- 快速創建獨立運行的Spring項目以及主流框架集成
- 使用嵌入式的server容器,應用無需打成WAR包
- starters自動依賴與版本控制
- 有大量的自動配置,簡化開發
- 準生產環境運行應用監控
- 與雲計算的天然集成
之前不使用Spring Boot搭建web項目的過程是有多麼繁瑣
(1)配置 web.xml,加載 Spring 和 Spring mvc
(2)配置數據庫連接、配置 Spring 事務、配置日誌文件
(3)配置加載配置文件的讀取,開啓註解
(4)…
(5)配置完成之後部署 Tomcat 調試
三、Spring Boot快速玩轉
Spring Boot到底有多誘人,相信大家都迫不及待了,趕緊擼一把試試手!
步驟一:新建項目
打開IDEA,新建項目,選擇【Spring Initializr】 其他默認【Next】:
修改完【next】
勾選web模版
根據自己將項目存放路徑,然後【finish】
這樣項目就搭建完成,Spring Boot目錄結構如下
步驟二:編寫controller層
建議:首先大家,在開發或者學習中,搭建好一個項目,先測試一下,看是否能跑起來。Spring Boot我們先來測試控制器,是否真的可以。
編寫一個userCotroller類代碼如下:
package com.markjava.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@GetMapping("/hello")
@ResponseBody
public String test() {
return "hello spring boot";
}
}
步驟三:啓動項目
出現一下,說明你成功跑一個demo項目了
打開瀏覽器訪問輸入 http://localhost:8080/hello
,效果就出來啦,是不是簡單。
如何修改端口號
在resources
目錄下的application.properties
添加或者``
再次,打開瀏覽器訪問輸入 http://localhost:8081/hello
Spring Boot熱部署
其實,熱部署在你構建項目的時候可以選擇,或者通過pom.xml
添加也是可以的,這樣每次就不用都重啓項目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
四、分析Spring Boot目錄結構及pom.xml
基礎結構共有3個 文件
src/main/java
程序開發以及主程序入口src/main/resources
配置文件src/test/java
測試程序
pom.xml文件中核心模塊
<! --該標籤是在配置 Spring Boot 的父級依賴:-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
spring-boot-starter
:核心模塊,也是父級依賴,包括自動配置支持、日誌和 YAML,如果引入了spring-boot-starter-web
web 模塊可以去掉此配置,因爲spring-boot-starter-web
自動依賴了spring-boot-starter
。spring-boot-starter-test
:測試模塊,包括 JUnit、Hamcrest、Mockito。
初學者,如果對源碼有興趣,請往下看會更精彩
五、主程序分析
//@SpringBootApplication標註這個類是一個Springboot的應用
@SpringBootApplication
public class Springboot02DemoApplication {
public static void main(String[] args) {
//將Springboot應用啓動
SpringApplication.run(Springboot02DemoApplication.class, args);
}
}
SpringBootApplication源碼剖析,進入源碼,結果發現其實它是一個組合註解
第一個SpringBootConfiguration註解:@SpringBootConfiguration–>是Spring Boot配置類。下面有一個叫@Configuration:它是配置類,下面又有@Component,其實它就是一個注入組件。
第二個@EnableAutoConfiguration註解:是開啓自配配置功能
@AutoConfigurationPackage//自動配置包
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
@AutoConfigurationPackage:自動配置包,使用@Import(AutoConfigurationImportSelector.class)註解來完成的,它是spring boot底層註解,作用是給容器中導入組件。
六、自動配置原理
(1)Spring Boot啓動的時候首先加載主配置類,開啓啦自動配置的功能(@EnableAutoConfiguration)
(2)自動配置功能@EnableAutoConfiguration
的作用:它是利用了@Import(AutoConfigurationImportSelector.class)
給容器中導入一些組件。那麼,他會給我們導入哪些組件呢?進入AutoConfigurationImportSelector
源碼看一下部分源碼如下:
//@EnableAutoConfiguration註解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
1⃣️@Import(AutoConfigurationImportSelector.class)自動配置導入選擇
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
//----部分源碼省略----//
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
//----部分源碼省略----//
}
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
是獲取候選的配置,也就是獲取所有配置。
getCandidateConfigurations//獲取候選配置,核心方法
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
//SpringFactoriesLoader.loadFactoryNames通過加載器加載所有
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
//getBeanClassLoader()
protected ClassLoader getBeanClassLoader() {
return this.beanClassLoader;
}
//beanClassLoader
private ClassLoader beanClassLoader;
//下滑,找到
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
//斷言不爲空
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
注:META-INF/spring.factories是配置文件的核心
//getSpringFactoriesLoaderFactoryClass()
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;//標註了這個類的所有包
}
小結:將類路徑下META-INF/spring.factories裏面配置的所有EnableAutoConfiguration的值加到容器中
2⃣️@AutoConfigurationPackage自動配置包
@Import(AutoConfigurationPackages.Registrar.class)//導入選擇器,包註冊
public @interface AutoConfigurationPackage {}
(3)每一個自動配置類進行自動配置功能
總結
(1)、SpringBoot啓動會加載大量的自動配置類
(2)我們看我們需要的功能有沒有SpringBoot默認寫好的自動配置類;
(3)我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件有,我們就不需要再來配置了)
(4)給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值;
xxxxAutoConfigurartion:自動配置類;
給容器中添加組件
xxxxProperties:封裝配置文件中相關屬性;
總結
使用 Spring Boot 可以非常方便、快速搭建項目,使我們不用關心框架之間的兼容性,適用版本等各種問題,我們想使用任何東西,僅僅添加一個配置就可以,所以使用 Spring Boot 非常適合構建微服務。(引自:Spring Boot(一):入門篇)
參考資料
-
純潔的微笑:Spring Boot(一):入門篇
-
我沒有三顆心臟;Spring Boot 快速入門
歡迎轉載
歡迎關注公衆微信號:MarkerJava下一篇:thymeleaf模版引擎