springboot學習01-[springboot介紹、配置文件介紹、自動配置讀取原理]

springboot介紹、配置文件介紹、自動配置讀取原理

  • springBoot學習
    • 代碼說明
      • 為什么java -jar springJar包后項目就可以啟動
  • 配置文件介紹
    • 配置文件加載順序
    • 其他約定配置文件加載順序
    • profile配置文件加載
    • 配置文件綁定類屬性
      • 通過@Value的方式進行屬性注入
      • 通過@ConfigurationProperties的方式進行屬性注入
      • 配置文件占位符
      • 配置文件-屬性注入:數據校驗
      • 通過@PropertySource可以引入外部properties配置文件
  • Springboot自動配置底層原理
    • springboot配置讀取原理
      • 這些注解里面最主要的就是@EnableAutoConfiguration
        • @Import({AutoConfigurationImportSelector.class}詳細解讀
          • process獲取配置方法解讀
    • 自動配置類原理

springBoot學習

依賴引入

 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>8</maven.compiler.target><maven.compiler.source>8</maven.compiler.source></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version></parent><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!--打包好幫我們把所有依賴的jar 統統放到jar文件里面的BOOT-INF\lib中設置MANIFEST.MF設置了啟動類 .JarLauncher:自定義類加載器加載所有的jar包,調用start-class。從而啟動項目--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

代碼說明

所有的springboot都必須繼承spring-boot-starter-parent,通過里面的<artifactId>spring-boot-dependencies</artifactId>幫我們管理了依賴的版本

為什么引入了starter后其他依賴也就被引入了?

一個starter也就是啟動器,內置了很多的依賴,就相當于一個聚合,引入一個starter也就都引入了

為什么java -jar springJar包后項目就可以啟動

  • 先打包
    在這里插入圖片描述
    將打的jar包解壓可以看到有個BOOT-INF的,里面還有個lib包這個lib包里存的就是項目依賴的其他jar包,叫fat-jar
    在這里插入圖片描述
    META-INF中有個MANIFEST.MF文件,里面的Main-Class是所有的jar文件都有的,這個屬性會自定義一個類加載器去加載fat-jar中的jar包。然后調用Start-Class去啟動項目
    在這里插入圖片描述
    META-INF中的MANIFEST.MF文件中有一個Main-Class屬性,這個屬性指向了一個自定義的類加載器。這個類加載器在啟動Spring Boot應用時會加載fat-jar中的所有依賴,包括starter依賴。
    Start-Class屬性則指定了應用啟動時要執行的類。通過這種方式,Spring Boot能夠在構建的fat-jar中自動尋找并加載所有必要的依賴,從而實現應用的啟動。

配置文件介紹

springboot使用一個全局的配置文件 核心配置文件,配置文件名在 約定的情況下 名字是固定的就叫application
配置文件的作用:修改springboot自動配置的默認值;springboot在底層都給我們自動配置好了。比如端口號,springboot默認端口號8080,但是我們可以通過配置文件覆蓋默認配置。

配置文件加載順序

配置文件讀取優先級:bootstrap.properties>bootstrap.yml>application.properties>application.yml 優先級大的會覆蓋優先級小的

其他約定配置文件加載順序

1、classpath根目錄下
在這里插入圖片描述
2、classpath根目錄/config
在這里插入圖片描述
3、項目根目錄
如果當前項目是繼承/耦合 關系maven項目的話,項目根目錄=父maven項目的根目錄。如果是項目只有一個模塊那么項目根目錄 那就是當前模塊的根目錄
在這里插入圖片描述
4、項目根目錄 /config
如果當前項目是繼承/耦合 關系maven項目的話,項目根目錄=父maven項目的根目錄 /config。如果是項目只有一個模塊那么項目根目錄 那就是當前模塊的根目錄 /config
在這里插入圖片描述
優先級由上到下,由低到高

profile配置文件加載

多環境配置配置文件
profile文件命名規則:application-名稱.yml
在這里插入圖片描述

  • 在applicaction.yml中進行激活
spring:profiles:active: dev

配置文件綁定類屬性

  • 定義實體bean
@Data
@ToString
public class User {private String username;private Integer age;private Date birthday;private List<String> hobbies;private Map<Integer,String> girlFriend;private Address address;
}@Data
public class Address {private Integer id;private String detailAddress;
}
  • 定義yml文件
user:username: zzqage: 25

通過@Value的方式進行屬性注入

@Data
@ToString
@Component
public class User {@Value("${user.username}")private String username;@Value("${user.age}")private Integer age;private Date birthday;private List<String> hobbies;private Map<Integer,String> girlFriend;private Address address;
}
  • 測試
@SpringBootTest(classes = MyApplication.class)
public class Test {@Autowiredprivate User user;@org.junit.jupiter.api.Testpublic void test(){System.out.println(user);}
}

在這里插入圖片描述

通過@ConfigurationProperties的方式進行屬性注入

@Data
@ToString
@Component
@ConfigurationProperties(prefix = "user")
public class User {private String username;private Integer age;private Date birthday;private List<String> hobbies;private Map<Integer,String> girlFriend;private Address address;
}
  • 測試
@SpringBootTest(classes = MyApplication.class)
public class Test {@Autowiredprivate User user;@org.junit.jupiter.api.Testpublic void test(){System.out.println(user);}
}

在這里插入圖片描述
@ConfigurationProperties:常用于bean屬性和yml配置文件的綁定。prefix:可以指定配置文件中某一個節點,該節點中的子節點將自動和屬性進行綁定
此外@ConfigurationProperties還支持松散綁定
在這里插入圖片描述
@value和@ConfigurationProperties區別,最大的一個區別就是@ConfigurationProperties可以匹配多個,@value需要一個一個去匹配,比較麻煩

  • 我們目前寫yml文件沒有提示,如果需要提示需要引入spring-boot-configuration-processor依賴
    這個依賴會生成METE-INFO 元數據 用于提供idea自動提示配置文件的
     <!--這個依賴會生成METE-INFO 元數據 用于提供idea自動提示配置文件的--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!--依賴不會傳播 如果這是個父模塊,子模塊不會繼承這個依賴--><optional>true</optional></dependency>
  • 如果想要自動提示還需要修改idea相關配置
    在這里插入圖片描述
    生成的元數據-用于自動提示
    在這里插入圖片描述
  • 補充完剩余的屬性
  • list類型
  hobbies:- 唱歌- 跳舞- 打籃球hobbies: [唱歌、跳舞、打籃球]

在這里插入圖片描述

  • map的類型
  girl-friend:18: 范冰冰19: 劉亦菲girl-friend: {18:范冰冰,19:劉亦菲}

在這里插入圖片描述

  • 嵌套對象
  address:id: 5detailAddress: 6666
  • 完整配置
user:username: zzqage: 123birthday: 2020/01/01hobbies:- 唱歌- 跳舞- 打籃球girl-friend: {18:范冰冰,19:劉亦菲}address:id: 6detailAddress: 6666

配置文件占位符

可以通過${}來引用其他的配置項,這就是配置文件占位符,${}還可以引用springboot內置的一些屬性,比如random.uuid

user:username: zzqage: 123birthday: 2020/01/01hobbies:- 唱歌- 跳舞- 打籃球girl-friend: {18:范冰冰,19:劉亦菲}address:id: 6detailAddress: ${user.username}的家

id: ${random.int}

user:username: zzqage: 123birthday: 2020/01/01hobbies:- 唱歌- 跳舞- 打籃球girl-friend: {18:范冰冰,19:劉亦菲}address:id: ${random.int}detailAddress: ${user.username}的家

配置文件-屬性注入:數據校驗

只支持@ConfigurationProperties,在使用的時候只需要加@Validated(支持對jsr-303數據校驗)

  • jsr-303數據校驗
    在這里插入圖片描述
    要支持對jsr-303數據校驗還需要加入一個數據校驗的場景啟動器
 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
  • 測試 -實體bean要測試的屬性加上注解
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "user")
@Validated
public class User {private String username;private Integer age;private Date birthday;private List<String> hobbies;private Map<Integer,String> girlFriend;@NotNullprivate Address address;
}
  • 配置文件配置-去掉address不讓能夠注入
user:username: zzqage: 123birthday: 2020/01/01hobbies:- 唱歌- 跳舞- 打籃球girl-friend: {18:范冰冰,19:劉亦菲}

結果在這里插入圖片描述

通過@PropertySource可以引入外部properties配置文件

  • properties配置
    在這里插入圖片描述
user.username=zzq
user.age=123
user.birthday=2020/02/06
user.hobbies=[跳舞、唱歌]
user.girlFriend.18=范冰冰
user.girlFriend.19=劉亦菲
user.address.id=5
user.address.detailAddress=上海
  • 實體bean配置-@PropertySource(“classpath:data/user.properties”)
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "user")
@Validated
@PropertySource("classpath:data/user.properties")
public class User {private String username;private Integer age;private Date birthday;private List<String> hobbies;private Map<Integer,String> girlFriend;private Address address;
}

Springboot自動配置底層原理

springboot配置讀取原理

@SpringBootConfiguration:Spring Boot的配置類:標注在某個類上,表示這是一個Spring Boot的配置類

@Configuration:配置類上來標注這個注解,配置類也是容器的一個組件

@EnableAutoConfiguration:開啟自動配置功能:以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration告訴SpringBoot開啟自動配置功能,會幫我們自動去加載配置類,這樣自動配置才能生效

@ComponentScan:掃描包,如果沒有指定掃描包spring底層會自動掃描當前配置類所在的包和子包, TypeExcludeFilter:springboot對外提供的擴展類,可以供我們去按照我們的自定義的方式進行排除。AutoConfigurationExcludeFilter:排除所有實現了AutoConfigurationExcludeFilter 接口 配置類并且自動配置類
在這里插入圖片描述

這些注解里面最主要的就是@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
    這個注解的作用:將當前配置類所在包保存在BasePackages的Bean中。供Sspring內部使用
@Import({AutoConfigurationPackages.Registrar.class}) //保存掃描路徑,提供給spring-data-jpa 
public @interface AutoConfigurationPackage {

就是注冊了一個保存當前配置類所在包的一個bean

@Import({AutoConfigurationImportSelector.class}詳細解讀
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

AutoConfigurationImportSelector是一個實現了DeferredImportSelector的selector類

  • 復習ImportSelector
    作用:返回類路徑的完整限定名,并且將這些類注冊成bean
    在這里插入圖片描述
  • DeferredImportSelector:變種的延遲ImportSelector
    DeferredImportSelector工作原理
    在這里插入圖片描述
  • 具體使用
    如果getImportGroup為空則執行importselectors,否則執行getImportGroup返回類的selectImports
public class MyImportSelector implements DeferredImportSelector {@Overridepublic Class<? extends Group> getImportGroup() {return AutoConfigurationGroupdd.class;}@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.springboot.controller.bean.User"};}private static class AutoConfigurationGroupdd implements DeferredImportSelector.Group{AnnotationMetadata metadata;@Overridepublic void process(AnnotationMetadata metadata, DeferredImportSelector selector) {}@Overridepublic Iterable<Entry> selectImports() {List<Entry> list =new ArrayList<>();list.add(new Entry(this.metadata,"com.springboot.controller.bean.Person"));return list;}}
}
process獲取配置方法解讀

process方法可以獲取META-INF/spring.factories里面的內容并把內容給selectorimports方法讓這個方法去把spring.factories里面的配置注冊成bean
在這里插入圖片描述

        //獲取spring.factories里面的配置類@Overridepublic void process(AnnotationMetadata metadata, DeferredImportSelector selector) {}//將配置類注冊成bean@Overridepublic Iterable<Entry> selectImports() {}

getAutoConfigurationEntry—>getCandidateConfigurations
getCandidateConfigurations再通過spring加載器來獲取配置

        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

自動配置類原理

以HttpEncodingAutoConfiguration為例

@Configuration(proxyBeanMethods = false
)
@EnableConfigurationProperties({ServerProperties.class})
@ConditionalOnWebApplication(type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(prefix = "server.servlet.encoding",value = {"enabled"},matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {private final Encoding properties;public HttpEncodingAutoConfiguration(ServerProperties properties) {this.properties = properties.getServlet().getEncoding();}@Bean@ConditionalOnMissingBeanpublic CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));return filter;}
}
  • @Configuration( proxyBeanMethods = false)詳解
    標記了@Configuration Spring底層會給配置創建cglib動態代理,目的:給標記了@bean的方法在創建bean的時候,會執行動態代理類(這個動態代理類會先從ioc容器里面拿如果拿不到在調用bean方法進行創建,以滿足單例模式)
    所以 proxyBeanMethods = false,就不讓它去產生代理類
  • @EnableConfigurationProperties({ServerProperties.class})詳解
    啟用可以在配置類設置的屬性 對應的類(在配置文件中可以寫哪些屬性就由這個配置類中的屬性決定)
    啟用配置類的屬性:里面導入了一個屬性配置類
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35235.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣62 不同路徑

一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff1f; 輸入&…

【LC刷題】DAY16:530 501 236

【LC刷題】DAY16&#xff1a;530 501 236 文章目錄 【LC刷題】DAY16&#xff1a;530 501 236530. 二叉搜索樹的最小絕對差 [link](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/)501.二叉搜索樹中的眾數236. 二叉樹的最近公共祖先 [link](htt…

壓縮文件夾的時候 找不到該文件或您沒有讀取該文件的權限。

在壓縮文件夾時&#xff0c;出現 “找不到該文件或您沒有讀取該文件的權限” 錯誤&#xff0c;可能有以下幾種原因和解決方法&#xff1a; 1. 文件不存在或路徑錯誤 檢查文件路徑&#xff1a;確保文件路徑正確且文件確實存在。 文件名和路徑長度&#xff1a;Windows 對文件路…

FedCache 2.0引領聯邦邊緣學習性能與通信效率革新

FedCache 2.0引領聯邦邊緣學習性能與通信效率革新 在今天的數字化時代&#xff0c;邊緣計算正迅速成為推動終端設備智能化的核心技術之一&#xff1b;如何在保證數據隱私的同時提高數據在網絡邊緣的處理效率和效果&#xff0c;已成為業界面臨的一大挑戰。最近&#xff0c;《Fe…

二分類問題中的性能指標【python,機器學習,算法】

平均絕對誤差&#xff08;MAE&#xff09; 平均絕對誤差&#xff08;Mean Absolute Error, MAE&#xff09;是衡量模型預測誤差的一種方法&#xff0c;通常用于回歸分析。它表示的是預測值與真實值之間差的絕對值的平均數。計算公式如下&#xff1a; M A E 1 N ∑ i 1 N ∣…

MacOS 上安裝和管理 Node.js

在 macOS 上安裝和管理 Node.js&#xff0c;使用 Node Version Manager (NVM) 是一種簡便且高效的方法。NVM 允許您輕松地安裝、切換和管理不同版本的 Node.js。本指南將帶您一步步完成這一過程。 步驟 1&#xff1a;安裝 Node Version Manager (NVM) 首先&#xff0c;我們需…

電巢科技CIOE中國光博會:激光雷達技術應用研討會圓滿落幕!

2024年6月20日&#xff0c;由CIOE中國光博會與電巢科技聯合主辦的“激光雷達技術應用”線上研討會成功舉行。本次線上研討會是CIOE中國光博會與電巢科技首次聯合主辦的論壇&#xff0c;旨在借助雙方自身資源優勢&#xff0c;為行業發展提供可靠的交流平臺。接下來&#xff0c;C…

Android焦點機制結合WMS

文章前提&#xff1a; 了解WMS基本作用了解window的概念&#xff0c;phoneWindow&#xff0c;rootViewImpl了解view的事件分發 開始&#xff1a; 講三件事情&#xff1a; window的創建&#xff0c;更新焦點的更新事件的分發 Window的創建&#xff0c;更新&#xff1a; wi…

基于 Redis 實現秒殺資格判斷,提升并發性能

在互聯網電商平臺上&#xff0c;秒殺活動往往會吸引大量用戶同時搶購&#xff0c;如何高效地處理高并發請求&#xff0c;保證用戶體驗&#xff0c;是一個重要的技術挑戰。本文將介紹如何基于 Redis 實現秒殺資格的判斷&#xff0c;提高并發性能。 基本思路 秒殺活動的核心流程…

AI 編程還有前景嘛?

自從各個大廠相繼出品 AI 編程助手之后&#xff0c;AI 在編程領域的發展&#xff0c;可謂是幾無寸進。 相比于 AI 在多模態領域火熱&#xff0c;AI 在編程領域的熱度已經完全下來了。 阿七在公眾號搜索了關鍵詞「AI編程」&#xff0c;發現搜索出來的公眾號寥寥無幾&#xff0…

LLM生成模型在生物蛋白質應用:ESM3

參考&#xff1a; https://github.com/evolutionaryscale/esm 通過GPT模型原理&#xff0c;輸入蛋白質序列等模態輸出預測的蛋白質序列及結構 使用 參考&#xff1a;https://colab.research.google.com/github/evolutionaryscale/esm/blob/main/examples/generate.ipynb#sc…

(六)使用統計學方法進行變量有效性測試(43道選擇題)

本文整理了使用統計學方法進行變量有效性測試相關的練習題&#xff0c;共43道&#xff0c;適用于想鞏固理論基礎的同學。來源&#xff1a;如荷學數據科學題庫&#xff08;CDA二級-第7章&#xff09;。 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09;…

【無人機三維路徑規劃】基于樹木生長算法TGA實現復雜城市地形下無人機避障三維航跡規劃附Matlab代碼

% 定義無人機起始位置和目標位置 start_point [0, 0, 0]; % 起始位置 [x, y, z] target_point [100, 100, 100]; % 目標位置 [x, y, z] % 定義城市地形和障礙物信息 city_map imread(‘city_map.png’); % 城市地形圖像 obstacles [ 20, 30, 10; % 障礙物1位置 [x, y, z] …

三分之一的違規行為未被發現

Gigamon 調查顯示&#xff0c;隨著漏洞的針對性越來越強、越來越復雜&#xff0c;企業在檢測漏洞方面也面臨越來越大的困難&#xff0c;超過三分之一的企業表示&#xff0c;現有的安全工具無法在漏洞發生時檢測到它們。 隨著混合云環境變得越來越復雜&#xff0c;以及惡意行為…

Java 語言特定指南

Java 語言特定指南 本 Java 入門指南將教您如何使用 Docker 創建一個容器化的 Spring Boot 應用程序。在本模塊中&#xff0c;您將學習如何&#xff1a; 使用 Maven 容器化并運行一個 Spring Boot 應用程序設置本地開發環境以將數據庫連接到容器、配置調試器&#xff0c;并使…

篩斗數據:引領未來,以技術創新推動在線推廣新紀元

在數字化浪潮的推動下&#xff0c;企業在線推廣已成為市場拓展的關鍵手段。然而&#xff0c;在海量信息中精準定位目標用戶&#xff0c;有效提升轉化率&#xff0c;卻是一大挑戰。篩斗數據&#xff0c;作為一家專注于數據提取與分析的技術公司&#xff0c;正以其獨特的技術優勢…

云計算基礎知識

前言&#xff1a; 隨著ICT技術的高速發展&#xff0c;企業架構對計算、存儲、網絡資源的需求更高&#xff0c;急需一種新的架構來承載業務&#xff0c;以獲得持續&#xff0c;高速&#xff0c;高效的發展&#xff0c;云計算應運而生。 云計算背景 信息大爆炸時代&#xff1a…

Linux 標準IO的fopen和fclose

getchar(),putchar() ‐‐‐‐ 一個字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一個字符&#xff0c;一串字符都可以 fopen函數的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打開一個文件 * param ‐ path…

進階篇07——InnoDB引擎介紹

概覽 邏輯存儲結構 架構 當執行增刪改查操作時&#xff0c;操作的是緩沖區的數據&#xff0c;如果緩沖區里沒有要操作的數據&#xff0c;就會從磁盤中讀取數據加載到緩沖區中&#xff1b;緩沖區的數據會以一定的頻率通過后臺線程刷新到磁盤中永久存儲。 內存結構 磁盤結構 后…

數據結構(Java):順序表集合類ArrayList

1、線性表 線性表&#xff0c;在邏輯結構上是連續的&#xff08;可理解為連續的一條直線&#xff0c;一對一的關系&#xff09;&#xff0c;而在物理結構上不一定連續&#xff0c;通常以數組和鏈式結構進行存儲。 線性表是一種在實際中廣泛使用的數據結構&#xff0c;常見的線…