Spring Boot(1)-快速入門及自動配置源碼剖析,入門就這篇足矣!

文章內容使用 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】:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-APs8wasf-1591172940642)(https://i.loli.net/2020/06/03/oxNcOZae6qdEsJb.png)]

修改完【next】

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-D9MN62kG-1591172940646)(https://i.loli.net/2020/06/03/kLOaop3iJrvz8nX.png)]

勾選web模版

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-id0JpsH5-1591172940649)(https://i.loli.net/2020/06/03/YTQGf12tDcqBjAh.png)]

根據自己將項目存放路徑,然後【finish】

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ueu0Wfkb-1591172940653)(https://i.loli.net/2020/06/03/bqSUROJg28ByAX6.png)]

這樣項目就搭建完成,Spring Boot目錄結構如下
在這裏插入圖片描述

步驟二:編寫controller層

建議:首先大家,在開發或者學習中,搭建好一個項目,先測試一下,看是否能跑起來。Spring Boot我們先來測試控制器,是否真的可以。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WbJb8SVd-1591172940659)(https://i.loli.net/2020/06/03/U5zMiBcVwK87gus.png)]

編寫一個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";
    }
}

步驟三:啓動項目

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-V7D76qK1-1591172940662)(https://i.loli.net/2020/06/03/LrcH1kY2Mylotp9.png)]

出現一下,說明你成功跑一個demo項目了

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gAb1Nped-1591172940665)(https://i.loli.net/2020/06/03/CqJFxfD4RUQ1kEp.png)]

打開瀏覽器訪問輸入 http://localhost:8080/hello,效果就出來啦,是不是簡單。

如何修改端口號

resources目錄下的application.properties添加或者``

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5sSTyaOl-1591172940670)(https://i.loli.net/2020/06/03/eKiSTjWLZVtO4nG.png)]

再次,打開瀏覽器訪問輸入 http://localhost:8081/hello

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zITTCrYi-1591172940673)(https://i.loli.net/2020/06/03/9rEa6BkLuHTNYMJ.png)]

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源碼剖析,進入源碼,結果發現其實它是一個組合註解
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WeL3jaEc-1591172940676)(https://i.loli.net/2020/06/03/VJm84AXEK9jCZeB.png)]

第一個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(一):入門篇

參考資料

歡迎轉載
歡迎關注公衆微信號:MarkerJava

下一篇:thymeleaf模版引擎

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章