SpringBoot之HelloWorld仔細分析

来源:https://www.cnblogs.com/xyzmy/archive/2018/10/11/9770399.html
-Advertisement-
Play Games

spring-boot-starter-web:spring-boot-starter:spring-boot場景啟動器;幫我們導入了web模塊 正常運行所依賴的組件; Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器), 只需要在項目裡面引入這些starter ...


程式中的pom.xml文件:
一、父級標簽
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.0.5.RELEASE</version>
   <relativePath/> 
</parent>

這是一個父級標簽:讓我們點擊org.springframework.boot就會查看到他的父級的依賴:


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>
就會發現它才是真正的SpringBoot的版本控制中心,這樣一來我們在導入
依賴的時候就不需要寫導入的版本號了,但是如果
不在dependencies裡面
管理的依賴還是需要進行版本號的輸入的。
二、依賴標簽(啟動器)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter-webspring-boot-starter:spring-boot場景啟動器;幫我們導入了web模塊

正常運行所依賴的組件;

Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器),

只需要在項目裡面引入這些starter相關場景的所有依賴都會導入進來。要用什麼

功能就導入什麼場景的啟動器。

例如:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

這是一個test(測試用的)啟動器,我們要用的是測試功能,導入測試場景的啟動器就可以了。


 

程式中的主程式文件:

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {     
        SpringApplication.run(DemoApplication.class, args);
    }
}

@SpringBootApplicationSpring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,

SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用;

我們接下來就研究一下這個@SpringBootApplication註解,點進去後看到的內容是:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

1)、@SpringBootConfiguration:SpringBoot的配置類,標註在哪個類上面就代表這個類就是一個SpringBoot

的配置類,我們點進這個註解(@SpringBootConfiguration)裡面看一下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

我們看到了這個@Configuration註解,這就證明瞭SpringBootConfiguration 就是一個配置類,再點進到這個註解

@Configuration)裡面看一下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

 我們看到了@Component這個註解,證明瞭配置類也是容器中的一個組件。

2)、@EnableAutoConfiguration:開啟自動配置,這樣一來我們需要的所有配置,SpringBoot都將幫我們

配置完成,我們點進去這個註解(@EnableAutoConfiguration)看一看:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}

這裡面有這兩個重要的註解(@AutoConfigurationPackage與@Import({AutoConfigurationImportSelector.class})

先研究一下這個註解(@AutoConfigurationPackage)這是自動配置包的意思我們點進去看一下這個註解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}

裡面有一個@Import({Registrar.class})註解,這是Spring底層的註解,是導入一個組件的意思,導入的組件由

Registrar.class將主配置類(也就是SpringBootApplication標註的類)的所在層級以及該層級以下所有層級的

所有組件都掃描到Spring的容器中。

接下來我們研究一下這個註解(@Import({AutoConfigurationImportSelector.class}))這是一個給容器中導入組件的

一個註解,AutoConfigurationImportSelector:導入哪些組件的選擇器;將所有需要導入的組件以全類名的方式返回;

這些組件就會被添加到容器中;會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入

這個場景需要的所有組件,並配置好這些組件;下麵是源碼(AutoConfigurationImportSelector這個類下麵的getAutoConfigurationImportFilters的方法):

protected List<AutoConfigurationImportFilter> getAutoConfigurationImportFilters() {
    return SpringFactoriesLoader.loadFactories(AutoConfigurationImportFilter.class, this.beanClassLoader);
}

 

 我們進入到SpringFactoriesLoader中看一下:這個是載入properties屬性文件的方法

 

public abstract class SpringFactoriesLoader {
    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
    private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
    private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap();
    public SpringFactoriesLoader() {
    }

 

我們看到所加在的properties文件的路徑是META-INF/spring.factories,我們找一下這個文件的位置看一下裡面都有什麼:

Spring Boot在啟動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為

自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;

J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-2.0.5.RELEASE.jar;中

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步 "《webpack4 系列教程(十二):處理第三方 JavaScript 庫》原文地址" 。或者來我的小站看更多內容: "godbmw.com" 0. 課程介紹和資料 " 本節課源碼" " 所有課程源碼" 本節課的代碼目錄如下: 本 ...
  • 商品,黃金交易流程最基礎、最核心的環節,無商品不電商。商品數據無處不在,商家(採銷、供應商)發佈管理、供應商下採購單、倉儲配送、促銷、搜索、商詳頁展現、購物支付、財務結算、售後服務等,都離不開商品。商品信息要準確傳導於京東整個供應鏈的各節點,必須要有一套穩健、可靠的商品服務體系支撐。 原本並沒有統一 ...
  • 在數據分析當中的東西還是很多的,我在這裡只是啟髮式的介紹一下,瞭解到這方面的東西之後,使用的時候可以更快的找到解決辦法,希望能對大家有所幫助。 這次,依然是使用的sklearn中的iris數據集,對其進行通過熱圖來展示。 預處理 sklearn.preprocessing是機器學習庫中預處理的模塊, ...
  • 一、前言 Thymeleaf 的出現是為了取代 JSP,雖然 JSP 存在了很長時間,併在 Java Web 開發中無處不在,但是它也存在一些缺陷: 1、JSP 最明顯的問題在於它看起來像HTML或XML,但它其實上並不是。大多數的JSP模板都是採用HTML的形式,但是又摻雜上了各種JSP標簽庫的標 ...
  • 在賬戶表的基礎上,我新建了一個賬戶account_session表,用來記錄登錄賬戶的account_id和最新一次登錄成功用戶的session_id,然後首先要修改登錄方法:每次登錄成功後,要將登錄用戶信息寫入Session的同時還要更新account_session表裡相應賬戶的session_ ...
  • 本次和大家分享的主要是docker搭建es和springboot操作es的內容,也便於工作中或將來使用方便,因此從搭建es環境開始到代碼插入信息到es中;主要節點如下: 1.elasticsearch啟動 我本機環境是windows10,要掛載es的配置文件需要在本機上創建配置文件,因此這裡創建配置 ...
  • 直接gdb pgname 參數1 這種方式,參數1是不會帶到gdb里的 1,首先啟動程式 2,設置程式的參數 ...
  • 在上文 設計一個百萬級的消息推送系統 中提到消息流轉採用的是 Kafka 作為中間件。 其中有朋友咨詢在大量消息的情況下 Kakfa 是如何保證消息的高效及一致性呢? ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...