Web后端進階:springboot原理(面試多問)

1.配置優先級

3種配置文件:

  • application.properties
server.port=8081
  • application.yml
server:port: 8082
  • application.yaml
server:port: 8082

2種外部屬性的配置(Java系統屬性、命令行參數):

  • Java系統屬性配置 (格式: -Dkey=value)
-Dserver.port=9000
  • 命令行參數 (格式:–key=value)
--server.port=10010

優先級(從低到高):

  • application.yaml(忽略)
  • application.yml
  • application.properties
  • java系統屬性(-Dxxx=xxx)
  • 命令行參數(–xxx=xxx)

2.Bean的管理

2.1 Bean的作用域

在這里插入圖片描述

  • 可以借助Spring中的@Scope注解來進行配置作用域

[圖片]

注意事項:

  • IOC容器中的bean默認使用的作用域:singleton (單例)
  • 默認singleton的bean,在容器啟動時被創建,可以使用@Lazy注解來延遲初始化(延遲到第一次使用時)
  • prototype的bean,每一次使用該bean的時候都會創建一個新的實例
  • 實際開發當中,絕大部分的Bean是單例的,也就是說絕大部分Bean不需要配置scope屬性

2.2第三方Bean

之前我們所配置的bean,像controller、service,dao三層體系下編寫的類,這些類都是我們在項目當中自己定義的類(自定義類)。當我們要聲明這些bean,也非常簡單,我們只需要在類上加上@Component以及它的這三個衍生注解(@Controller、@Service、@Repository),就可以來聲明這個bean對象了。
但是在我們項目開發當中,還有一種情況就是這個類它不是我們自己編寫的,而是我們引入的第三方依賴當中提供的,那么此時我們是無法使用 @Component 及其衍生注解來聲明bean的,此時就需要使用@Bean注解來聲明bean 了。

演示1:

  • 在啟動類中直接聲明這個Bean。比如:我們可以將我們之前使用的阿里云OSS操作的工具類,基于@Bean注解的方式來聲明Bean。
import com.itheima.utils.AliyunOSSOperator;
import com.itheima.utils.AliyunOSSProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;@ServletComponentScan
@EnableScheduling
@SpringBootApplication
public class TliasWebManagementApplication {public static void main(String[] args) {SpringApplication.run(TliasWebManagementApplication.class, args);}@Beanpublic AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties ossProperties) {return new AliyunOSSOperator(ossProperties);}
}

演示2:
若要管理的第三方 bean 對象,建議對這些bean進行集中分類配置,可以通過 @Configuration 注解聲明一個配置類。【推薦】

package com.itheima.config;import com.itheima.utils.AliyunOSSOperator;
import com.itheima.utils.AliyunOSSProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OSSConfig {@Beanpublic AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties ossProperties) {return new AliyunOSSOperator(ossProperties);}
}
  • 通過@Bean注解的name 或 value屬性可以聲明bean的名稱,如果不指定,默認bean的名稱就是方法名。
  • 如果第三方bean需要依賴其他bean對象,直接在bean定義方法中設置形參即可,容器會根據類型自動裝配。

3.SpringBoot原理

3.1起步依賴

在這里插入圖片描述
當我們引入了 spring-boot-starter-web 之后,maven會通過依賴傳遞特性,將web開發所需的常見依賴都傳遞下來。
在這里插入圖片描述

3.2自動配置

SpringBoot的自動配置就是當spring容器啟動后,一些配置類、bean對象就自動存入到了IOC容器中,不需要我們手動去聲明,從而簡化了開發,省去了繁瑣的配置操作。
在這里插入圖片描述

3.2.1實現方案

3.2.1.1方案一

@ComponentScan組件掃描

@SpringBootApplication
@ComponentScan({"com.itheima","com.example"}) //指定要掃描的包
public class SpringbootWebConfigApplication {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfigApplication.class, args);}
}
3.2.1.2方案二

@Import導入

  • 導入形式主要有以下幾種:
    1. 導入普通類
    2. 導入配置類
    3. 導入ImportSelector接口實現類

1). 使用@Import導入普通類:

@Import(TokenParser.class) //導入的類會被Spring加載到IOC容器中
@SpringBootApplication
public class SpringbootWebConfigApplication {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfigApplication.class, args);}
}

2). 使用@Import導入配置類

  • 配置類
@Configuration
public class HeaderConfig {@Beanpublic HeaderParser headerParser(){return new HeaderParser();}@Beanpublic HeaderGenerator headerGenerator(){return new HeaderGenerator();}
}
  • 啟動類
@Import(HeaderConfig.class) //導入配置類
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}
}

3). 使用@Import導入ImportSelector接口實現類:

  • ImportSelector接口實現類
public class MyImportSelector implements ImportSelector {public String[] selectImports(AnnotationMetadata importingClassMetadata) {//返回值字符串數組(數組中封裝了全限定名稱的類)return new String[]{"com.example.HeaderConfig"};}
}
  • 啟動類
@Import(MyImportSelector.class) //導入ImportSelector接口實現類
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}
}

4). 使用第三方依賴提供的 @EnableXxxxx注解(best)

  • 第三方依賴中提供的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)//指定要導入哪些bean對象或配置類
public @interface EnableHeaderConfig { 
}
  • 在使用時只需在啟動類上加上@EnableXxxxx注解即可
@EnableHeaderConfig  //使用第三方依賴提供的Enable開頭的注解
@SpringBootApplication
public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(SpringbootWebConfig2Application.class, args);}
}

3.2.2原理分析

3.2.2.1源碼跟蹤

源碼跟蹤技巧:
在跟蹤框架源碼的時候,一定要抓住關鍵點,找到核心流程。一定不要從頭到尾一行代碼去看,一個方法的去研究,一定要找到關鍵流程,抓住關鍵點,先在宏觀上對整個流程或者整個原理有一個認識,有精力再去研究其中的細節。

在這里插入圖片描述
在@SpringBootApplication注解中包含了:

  • 元注解(不再解釋)
  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

自動配置源碼小結:
自動配置原理源碼入口就是 @SpringBootApplication 注解,在這個注解中封裝了3個注解,分別是:

  • @SpringBootConfiguration
    • 聲明當前類是一個配置類
  • @ComponentScan
    • 進行組件掃描(SpringBoot中默認掃描的是啟動類所在的當前包及其子包)
  • @EnableAutoConfiguration
    • 封裝了@Import注解(Import注解中指定了一個ImportSelector接口的實現類)
      在實現類重寫的selectImports()方法,讀取當前項目下所有依賴jar包中META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports兩個文件里面定義的配置類(配置類中定義了@Bean注解標識的方法)。

當SpringBoot程序啟動時,就會加載配置文件當中所定義的配置類,并將這些配置類信息(類的全限定名)封裝到String類型的數組中,最終通過@Import注解將這些配置類全部加載到Spring的IOC容器中,交給IOC容器管理。

3.2.2.2 @Conditional

@Conditional注解:

  • 作用:按照一定的條件進行判斷,在滿足給定條件后才會注冊對應的bean對象到Spring的IOC容器中。
  • 位置:方法、類
  • @Conditional本身是一個父注解,派生出大量的子注解:
    • @ConditionalOnClass:判斷環境中有對應字節碼文件,才注冊bean到IOC容器。
    • @ConditionalOnMissingBean:判斷環境中沒有對應的bean(類型或名稱),才注冊bean到IOC容器。
    • @ConditionalOnProperty:判斷配置文件中有對應屬性和值,才注冊bean到IOC容器。

最后再給大家梳理一下自動配置原理:
在這里插入圖片描述

自動配置的核心就在@SpringBootApplication注解上,SpringBootApplication這個注解底層包含了3個注解,分別是:

  • @SpringBootConfiguration
  • @ComponentScan
  • @EnableAutoConfiguration

@EnableAutoConfiguration這個注解才是自動配置的核心。

  • 它封裝了一個@Import注解,Import注解里面指定了一個ImportSelector接口的實現類。
  • 在這個實現類中,重寫了ImportSelector接口中的selectImports()方法。
  • 而selectImports()方法中會去讀取兩份配置文件,并將配置文件中定義的配置類做為selectImports()方法的返回值返回,返回值代表的就是需要將哪些類交給Spring的IOC容器進行管理。
  • 那么所有自動配置類的中聲明的bean都會加載到Spring的IOC容器中嗎? 其實并不會,因為這些配置類中在聲明bean時,通常都會添加@Conditional開頭的注解,這個注解就是進行條件裝配。而Spring會根據Conditional注解有選擇性的進行bean的創建。
  • @Enable 開頭的注解底層,它就封裝了一個注解 import 注解,它里面指定了一個類,是 ImportSelector 接口的實現類。在實現類當中,我們需要去實現 ImportSelector 接口當中的一個方法 selectImports
    這個方法。這個方法的返回值代表的就是我需要將哪些類交給 spring 的 IOC容器進行管理。
  • 此時它會去讀取兩份配置文件,一份兒是 spring.factories,另外一份兒是 autoConfiguration.imports。而在 autoConfiguration.imports
    這份兒文件當中,它就會去配置大量的自動配置的類。
  • 而前面我們也提到過這些所有的自動配置類當中,所有的 bean都會加載到 spring 的 IOC 容器當中嗎?其實并不會,因為這些配置類當中,在聲明 bean 的時候,通常會加上這么一類@Conditional
    開頭的注解。這個注解就是進行條件裝配。所以SpringBoot非常的智能,它會根據 @Conditional
    注解來進行條件裝配。只有條件成立,它才會聲明這個bean,才會將這個 bean 交給 IOC 容器管理。

3.2.3自定義starter

3.2.3.1實現
  • 第1步:創建自定義starter模塊 aliyun-oss-spring-boot-starter(進行依賴管理)
    • 把阿里云OSS所有的依賴統一管理起來
  • 第2步:創建autoconfigure模塊 aliyun-oss-spring-boot-autoconfigure
    • 在starter中引入autoconfigure (我們使用時只需要引入starter起步依賴即可)
  • 第3步:在autoconfigure模塊aliyun-oss-spring-boot-autoconfigure中完成自動配置
    1. 定義一個自動配置類,在自動配置類中將所要配置的bean都提前配置好
    2. 定義配置文件,把自動配置類的全類名定義在配置文件(META-INF/spring/xxxx.imports)中

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

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

相關文章

第十天:字符菱形

每日一道C題&#xff1a;字符菱形 問題&#xff1a;給定一個字符&#xff0c;用它構造一個對角線長5個字符&#xff0c;傾斜放置的菱形。 要求&#xff1a;輸入只有一行&#xff0c; 包含一個字符&#xff1b;輸出該字符構成的菱形。 最基礎的做法&#xff1a; #include <io…

Qt 多線程編程最佳實踐

在現代軟件開發中&#xff0c;多線程編程是提升應用性能和響應性的關鍵技術。Qt 作為一個強大的跨平臺框架&#xff0c;提供了豐富的多線程支持&#xff0c;包括 QThread、QtConcurrent、信號槽機制等。本文將深入探討 Qt 多線程編程的最佳實踐&#xff0c;幫助開發者避免常見陷…

Photo Studio PRO 安卓版:專業級照片編輯的移動解決方案

Photo Studio PRO 安卓版是一款功能強大的專業級照片編輯應用&#xff0c;旨在為用戶提供豐富而強大的編輯工具和特效&#xff0c;幫助用戶輕松地對照片進行美化和修飾。無論是攝影愛好者還是專業攝影師&#xff0c;都能通過這款應用實現從基礎調整到高級合成的全流程編輯。 核…

2025高考志愿怎么填?張雪峰最新“保底”推薦來了!這4個專業專科也能拿高薪,畢業不愁!

專業選得好&#xff0c;就業跑不了&#xff01;2025年高考落幕&#xff0c;現在是決戰未來的關鍵時刻&#xff0c;選專業比選學校更重要&#xff01; 今天&#xff0c;學長就根據張雪峰老師多次力薦、再結合2024年就業大數據&#xff0c;給大家盤點4個緊缺人才專業&#xff0c…

C++初學者4——標準數據類型

先導&#xff1a; 目錄 一、整形 二、浮點型 &#xff01;保留指定小數位數 三、布爾類型 關系運算 邏輯運算 ?C邏輯運算四句口訣? 四、字符型 ASCll碼 C中的字符表示 字符比較 ASCII中的常用轉換 大小寫轉換 轉換成0~25 五、數據類型隱式轉換 ?1. 隱式轉…

HCIP的MGRE綜合實驗1

拓撲圖&#xff1a;二、實驗要求 1、R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有Ip地址;2、R1和R5間使用PPP的PAP認證&#xff0c;R5為主認證方&#xff1b;R2與R5之間使用PPP的CHAP認證&#xff0c;R5為主認證方;R3與R5之間使用HDLC封裝;3、R2、R…

Go語言實戰案例-鏈表的實現與遍歷

在數據結構的世界中&#xff0c;鏈表&#xff08;Linked List&#xff09; 是一種經典的線性結構&#xff0c;它以靈活的插入與刪除能力著稱。鏈表不像數組那樣需要連續的內存空間&#xff0c;而是通過節點指針連接形成一條“鏈”。本篇我們將使用 Go 語言實現一個單向鏈表&…

C++常見的仿函數,預定義函數,functor,二元操作函數(對vector操作,加減乘除取余位運算等 )

C 標準庫在 <functional> 頭文件中為我們提供了一套非常方便的預定義函數對象&#xff08;也稱為“仿函數”或 “functor”&#xff09;&#xff0c;它們可以像變量一樣直接傳遞給 std::reduce 和其他標準算法。 你提到的 std::bit_or 和 std::multiplies 就是其中的成員…

【RH134 問答題】第 6 章 管理 SELinux 安全性

目錄SELinux 是如何保護資源的&#xff1f;什么是自由決定的訪問控制(DAC)&#xff1f;它有什么特點&#xff1f;什么是強制訪問控制(MAC)&#xff1f;它有什么特點&#xff1f;什么是 SELinux 上下文&#xff1f;setenforce 0 命令的作用是什么&#xff1f;定義一條 SELinux 文…

【MacOS】發展歷程

很高興為您詳細介紹 macOS 的詳細發展歷程。macOS 是蘋果公司開發的操作系統&#xff0c;用于 Mac 電腦、iPad 和 Apple TV 等設備。以下是 macos 的主要版本和發展歷程&#xff1a;1. System 7 (1991)發布日期&#xff1a;1991年特點&#xff1a;引入多任務處理功能。改進了拖…

智慧社區項目開發(二)——基于 JWT 的登錄驗證功能實現詳解

在 Web 應用中&#xff0c;登錄驗證是保障系統安全的核心環節。本文將結合具體接口文檔&#xff0c;詳細講解如何基于 JWT&#xff08;JSON Web Token&#xff09;實現登錄驗證功能&#xff0c;包括 JWT 配置、工具類封裝、登錄流程處理等關鍵步驟&#xff0c;幫助開發者快速理…

Jmeter的元件使用介紹:(七)后置處理器詳解

Jmeter的后置處理器主要用于取樣器執行后的提取數據操作。 Jmeter常用的后置處理器有:Json提取器、正則表達式提取器、邊界提取器、Beanshell后置處理器。此外還有Xpath提取器、CSS選擇器提取器等&#xff0c;由于這兩項多用前端頁面提取元素&#xff0c;目前的項目基本都是采…

Allure的安裝,在Pytest中的簡單使用以及生成測試報告

目錄 1.Allure的安裝 1--下載網址 2--選擇對應系統版本下載 3--配置Allure環境變量 4--驗證安裝是否成功 5--配置JAVAJDK的環境變量&#xff08;如果已經配置&#xff0c;可以忽視這一步&#xff09; 2.python中pytestAllure 1--python安裝Allure包 2--生成測試報告 1--使用pyt…

Oracle 數據庫報 ora-00257 錯誤并且執行alter system switch logfile 命令卡死的解決過程

Oracle 數據庫報 ora-00257 錯誤并且執行alter system switch logfile 命令卡死的解決過程 7月26日下午&#xff0c;某醫院用戶的 HIS 系統無法連接&#xff0c;報如下錯誤&#xff1a;初步判斷是歸檔日志問題。 用戶的 HIS 系統數據庫是雙節點 Oracle 11g Rac 集群。登錄服務器…

ArKTS:List 數組

一種&#xff1a;/**# encoding: utf-8# 版權所有 2025 ©涂聚文有限公司? # 許可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎# 描述&#xff1a; 數組# Author : geovindu,Geovin Du 涂聚文.# IDE : DevEco Studio 5.1.1 …

Spring Boot 3整合Spring AI實戰:9輪面試對話解析AI應用開發

Spring Boot 3整合Spring AI實戰&#xff1a;9輪面試對話解析AI應用開發 第1輪&#xff1a;基礎配置與模型調用 周先生&#xff1a;cc&#xff0c;先聊聊Spring AI的基礎配置吧。如何在Spring Boot 3項目中集成Ollama&#xff1f; cc&#xff1a;我們可以通過OllamaConfig.java…

標準SQL語句示例

一、基礎操作1. 數據庫操作-- 1. 創建數據庫 CREATE DATABASE 數據庫名稱 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 2. 刪除數據庫 DROP DATABASE IF EXISTS 數據庫名稱;-- 3. 選擇數據庫 USE 數據庫名稱;-- 4. 顯示所有數據庫 SHOW DATABASES;-- 5. 查看數據庫創…

STM32-基本定時器

一.基本定時器簡介 STM32F1 系列共有 8 個定時器&#xff0c;分別為&#xff1a;基本定時器、通用定時器、高級定時器。基本定時器 TIM6 和 TIM7 是一個 16 位的只能向上計數的定時器&#xff0c;只能定時&#xff0c;沒有外部IO。 二.基本定時器功能 上圖為基本定時器的功能框…

ofd文件轉pdf

主要后端使用Java實現&#xff0c;前端可隨意搭配http請求添加依賴&#xff1a;<!-- OFD解析與轉換庫 --><dependency><groupId>org.ofdrw</groupId><artifactId>ofdrw-converter</artifactId><version>1.17.9</version></…

4.應用層自定義協議與序列化

1.應用層程序員寫的一個個解決我們實際問題, 滿足我們日常需求的網絡程序, 都是在應用層1.1再談“協議”協議是一種 "約定". socket api 的接口, 在讀寫數據時, 都是按 "字符串" 的方式來發送接收的. 如果我們要傳輸一些 "結構化的數據" 怎么辦呢…