javaEE-Spring IOCDI

目錄

1、什么是Spring:

2.什么是IoC:

3. 什么是控制反轉呢??

4.IoC容器具備以下優點:

5.DI是什么:

依賴注?方法:

三種注入方法的優缺點:

@Autowired注解注入存在的問題:

@Autowired和@Resource的區別:

6.IoC和DI的使用:

7.Bean的存儲:

8.Bean的命名:

9.ApplicationContext VS BeanFactory

10.Bean的掃描路徑:

10.Spring, Spring Boot 和Spring MVC的關系以及區別:

11.

12.Spring框架中的Bean是否是線程安全的:


1、什么是Spring:

Spring是一個開源框架,他讓我們的開發更加簡單. 他?持?泛的應?場景, 有著活躍?龐?的社區
,是包含了眾多工具方法的IoC容器。

2.什么是IoC:

IoC: Inversion of Control (控制反轉), 也就是說 Spring 是?個"控制反轉"的容器.
IoC 是Spring的核?思想,在類上?添加 @RestController 和 @Controller 注解, 就是把這個對象交給Spring管理, Spring 框架啟動時就會加載該類. 把對象交給Spring管理, 就是IoC思想.

3. 什么是控制反轉呢??

獲得依賴對象的過程被反轉了。也就是說, 當需要某個對象時, 傳統開發模式中需要??通過 new 創建對象, 現在不需要再進?創建, 把創建對象的任務交給容器, 程序中只需要依賴注? (Dependency Injection,DI)就可以了.

這個容器稱為:IoC容器. Spring是?個IoC容器, 所以有時Spring 也稱為Spring 容器.

4.IoC容器具備以下優點:

資源不由使?資源的雙?管理,?由不使?資源的第三?管理,這可以帶來很多好處。

第?,資源集中管理,實現資源的可配置和易管理。IoC容器會幫我們管理?些資源(對象等), 我們需要使?時, 只需要從IoC容器中去取就可以了

第?,降低了使?資源雙?的依賴程度,也就是我們說的耦合度。我們在創建實例的時候不需要了解其中的細節。

Spring 就是?種IoC容器, 幫助我們來做了這些資源管理.

5.DI是什么:

DI: Dependency Injection(依賴注?)

容器在運?期間, 動態的為應?程序提供運?時所依賴的資源,稱之為依賴注?。程序運?時需要某個資源,此時容器就為其提供這個資源。簡單來說, 就是把對象取出來放到某個類的屬性中.

從這點來看, 依賴注?(DI)和控制反轉(IoC)是從不同的?度的描述的同?件事情,就是指通過引? IoC 容器,利?依賴關系注?的?式,實現對象之間的解耦。可以說, DI 是IoC的?種實現.

依賴注?方法:

?Spring也給我們提供了三種?式:

1. 屬性注?(Field Injection):使用@Autowired實現

2. 構造?法注?(Constructor Injection):在類的構造?法中實現注?,搭配@Autowired注解

注意事項:如果類只有?個構造?法,那么 @Autowired 注解可以省略;如果類中有多個構造?法,那么需要添加上 @Autowired 來明確指定到底使?哪個構造?法

3. Setter 注?(Setter Injection):和屬性的 Setter ?法實現類似,只不過在設置 set ?法的時候需要加上 @Autowired 注解 。

三種注入方法的優缺點:

屬性注入:

優點:代碼簡介,使用簡單。

?缺點:只能作用于 IoC容器,不能注入final修飾的類。

構造方法注入:

優點:可以注?final修飾的屬性 ;?注?的對象不會被修改;依賴對象在使?前?定會被完全初始化,因為依賴是在類的構造?法中執?的,?構造?法是在類加載階段就會執?的?法;通?性好, 構造?法是JDK?持的, 所以更換任何框架,他都是適?的。

?缺點:??注?多個對象時, 代碼會?較繁瑣

? Setter注?

優點: ?便在類實例之后, 重新對該對象進?配置或者注?

?缺點: 不能注??個Final修飾的屬性;注?對象可能會被改變, 因為setter?法可能會被多次調?, 就有被修改的?險

@Autowired注解注入存在的問題:

當同?類型存在多個bean時,僅通過類 類型注入時,會找到非唯一的Bean對象。

可以通過一下方法解決:

1. @Primary注解:當存在多個相同類型的Bean注?時,加上@Primary注解,來確定默認的實現.

2. @Qualifier注解:通過該注解的value屬性,指定當前要注入的Bean的名稱;不能單獨使用,要搭配@Autowired注解使用。

3.@Resource注解:按照Bean的名稱注入,通過name屬性指定要注入的Bean的名稱。

@Autowired和@Resource的區別:

相同點:

1. @Resource和@Autowired都是做bean的注入時使用。
2.兩者都可以寫在字段和setter方法上;

不同點:

1.@Autowired是Spring框架提供的注解;@Resource并不是Spring的注解,是JDK提供的注解,它的包是javax.annotation.Resource,需要導入;

2.@Autowired是按照類型注入的,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它的required屬性為false。如果我們想使用按照名稱(byName)來裝配,可以結合@Qualifier注解一起使用;

@Resource是按照名稱注入的,@Resource有兩個重要的屬性: name和type,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以,如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不制定name也不制定type屬性,這時將通過反射機制使用byName自動注入策略。

@Resource裝配順序:

①如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常。

②如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常。

③如果指定了type,則從上下文中找到類似匹配的唯一bean進行裝配,找不到或是找到多個,都會拋出異常。

④如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配。

6.IoC和DI的使用:

Spring 容器 管理的主要是對象, 這些對象, 我們稱之為"Bean". 我們把這些對象交由Spring管理, 由Spring來負責對象的創建和銷毀(實現作為容器的存和取的功能).

7.Bean的存儲:

要把某個對象交給IOC容器管理,需要在類上添加?個注解: @Component ,?Spring框架為了更好的服務web應?程序, 提供了更豐富的注解:
1. 類注解:

@Controller(控制器存儲):控制層, 接收請求, 對請求進?處理, 并進?響應

@Service(服務存儲):業務邏輯層, 處理具體的業務邏輯

@Repository(倉庫存儲):數據訪問層,也稱為持久層. 負責數據訪問操作

@Configuration(配置存儲):配置層. 處理項?中的?些配置信息

@Component(組件存儲):該注解是一個元注解,這幾個注解是該注解的衍生類。

2. ?法注解:@Bean.

分配這么多注解的作用:和應?分層是呼應的. 讓程序員看到類注解之后,就能直接了解當前類的?途。

方法注解的使用場景:

1. 使?外部包?的類, 沒辦法添加類注解

2. ?個類, 需要多個對象, ?如多個數據源 。這種場景, 我們就需要使??法注解 @Bean

(方法注解要配合類注解使用)

8.Bean的命名:

程序開發?員不需要為bean指定名稱(BeanId), 如果沒有顯式的提供名稱(BeanId),Spring容器將為該bean?成唯?的名稱。命名約定使?Java標準約定作為實例字段名. 也就是說,bean名稱以?寫字?開頭,然后使?駝峰式??寫.

?如:

類名: UserController, Bean的名稱為: userController

類名: AccountManager, Bean的名稱為: accountManager

當有多個字符并且第?個和第?個字符都是?寫時, 將保留原始的??寫。

?如

類名: UController, Bean的名稱為: UController

類名: AManager, Bean的名稱為: AManager

9.ApplicationContext VS BeanFactory

獲取bean對象, 是ApplicationContext的?類BeanFactory提供的功能。

? 繼承關系和功能??來說:

Spring 容器有兩個頂級的接?:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基礎的訪問容器的能?,?ApplicationContext 屬于 BeanFactory 的?類,還實現了多個別的接口,它除了繼承了 BeanFactory 的所有功能之外,它還擁有獨特的特性,還添加了對國際化?持、資源訪問?持、以及事件傳播等??的?持.

? 從性能??來說:延遲加載

1. BeanFactroy 采用的是延遲加載形式來注入 Bean 的,即只有在使用到某個 Bean 時(調用getBean()),才對該 Bean 進行加載實例化。這樣,我們就不能發現一些存在的 spring 的配置問題。而 ApplicationContext 則相反,它是在容器啟動時,一次性創建了所有的 Bean。這樣,在容器啟動時,我們就可以發現 Spring 中存在的配置錯誤

10.Bean的掃描路徑:

使?五?注解聲明的bean,要想?效, 還需要配置掃描路徑, 讓Spring掃描到這些注解 也就是通過 @ComponentScan 來配置掃描路徑。
在之前的使用中@ComponentScan 注解雖然沒有顯式配置,但也訪問成功了,是因為該注解已經包含在了啟動類聲明注解@SpringBootApplication 中了,默認掃描的范圍是SpringBoot啟動類所在包及其?包,在配置類上添加 @ComponentScan 注解, 該注解默認會掃描該類所在的包下所有的配置類。

10.Spring, Spring Boot 和Spring MVC的關系以及區別:

Spring:Spring 是?個開發應?框架,特點是:輕量級、?站式、模塊化,其?的是?于簡化企業級應?程序開發.

Spring的主要功能: 管理對象,以及對象之間的依賴關系, ?向切?編程, 數據庫事務管理, 數據訪問, web框架?持等。但是Spring具備?度可開放性, 并不強制依賴Spring。

Spring MVC: Spring MVC是Spring的?個?框架, 按照MVC模式設計了?個 MVC框架(?些?Spring 解耦的組件), 主要?于開發WEB應?和?絡接?,Spring MVC 是?個Web框架。

Spring Boot: Spring Boot是對Spring的?個封裝, 為了簡化Spring應?的開發?出現的,使?Spring Boot 可以更加快速的搭建框架, 降級開發成本, 讓開發?員更加專注于Spring應?的開發,??需過多關注XML的配置和?些底層的實現。

pring MVC和Spring Boot都屬于Spring,Spring MVC 是基于Spring的?個 MVC 框架,?Spring Boot 是基于Spring的?套快速開發整合包.

11.

12.Spring框架中的Bean是否是線程安全的:

Spring 框架并沒有對單例 Bean 進行任何多線程的封裝處理。

關于單例 Bean 的線程安全和并發問題,需要開發者自行去搞定。單例的線程安全問題,并不是 Spring 應該去關心的。 Spring 應該做的是,提供根據配置,創建單例 Bean 或多例 Bean 的功能。但實際上,大部分的 Spring Bean 并沒有可變的狀態,所以在某種程度上說 Spring 的單例Bean 是線程安全的。如果你的 Bean 有多種狀態的話,就需要自行保證線程安全。最淺顯的解決辦法,就是將多態 Bean 的作用域(Scope)由 Singleton 變更為 Prototype。

13.Spring如何解決循環依賴問題:

循環依賴:循環引用,就是兩個或兩個以上的bean對象互相持有對方,最終形成了閉環,如:A引用B,B引用C,C又引用A,就形成了循環引用。

處理整個流程大致如下:

1. 首先 A 完成初始化第一步并將自己提前曝光出來(通過 ObjectFactory 將自己提前曝光),在初始化的時候,發現自己依賴對象 B,此時就會去嘗試 get(B),這個時候發現 B 還沒有被創建出來;

2. 然后 B 就走創建流程,在 B 初始化的時候,同樣發現自己依賴 C,C 也沒有被創建出來;

3. 這個時候 C 又開始初始化進程,但是在初始化的過程中發現自己依賴 A,于是嘗試 get(A)。這

個時候由于 A 已經添加至緩存中(一般都是添加至三級緩存 singletonFactories),通過ObjectFactory 提前曝光,所以可以通過 ObjectFactory#getObject() 方法來拿到 A 對象。 C 拿到 A 對象后順利完成初始化,然后將自己添加到一級緩存中;

4. 回到 B, B 也可以拿到 C 對象,完成初始化, A 可以順利拿到 B 完成初始化。到這里整個鏈路

就已經完成了初始化過程了。

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

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

相關文章

TensorFlow Lite 全面解析:端側部署方案與PyTorch Mobile深度對比

1 TensorFlow Lite 基礎介紹 TensorFlow Lite (TFLite) 是 Google 為移動設備(Android, iOS)、微控制器(Microcontrollers)和其他嵌入式設備(如 Raspberry Pi)開發的輕量級深度學習推理框架。它的核心目標是…

mapbox進階,使用jsts實現平角緩沖區

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言 1.1 ??mapboxgl.Map 地圖對象 1.2 ??mapboxgl.Map style屬性 1.3 ??jsts myBufferOp 緩沖區生成對對象 …

linux裝好顯卡后如何檢查

背景:客戶通知裝好了顯卡,我們去機器上查看一下一. 使用到的命令 watch -n 1 nvidia-smi 可實時查看gpu的使用率nvidia-smi 之查看一次 二、查看內存和顯存 內存使用命令 free -h,顯存使用 nvidia-smi 這只是查看的navidia, 其他品牌的會不一樣

人工智能深度學習——卷積神經網絡(CNN)

一、圖像卷積運算 對圖像矩陣與濾波器矩陣進行對應相乘再求和運算,轉化得到新的矩陣。 作用:快速定位圖像中某些邊緣特征 英文:convolution(CNN)池化層實現維度縮減 池化:按照一個固定規則對圖像矩陣進行處…

SaaS 建站從 0 到 1 教程:Vue 動態域名 + 后端子域名管理 + Nginx 配置

SaaS 建站從 0 到 1 教程:Vue 動態域名 后端子域名管理 Nginx 配置 一、什么是 SaaS 建站? SaaS(Software as a Service)建站,就是通過一套統一的系統,支持用戶在線注冊、綁定域名、快速生成專屬網站。…

關于神經網絡中回歸的概念

神經網絡中的回歸詳解 引言 神經網絡(NeuralNetworks)是一種強大的機器學習模型,可用于分類和回歸任務。本文聚焦于神經網絡中的回歸(Regression),即預測連續輸出值(如房價、溫度)。…

JAVASCRIPT 前端數據庫-V9--仙盟數據庫架構-—仙盟創夢IDE

老版本 在v1 版本中我們講述了 基礎版的應用JAVASCRIPT 前端數據庫-V1--仙盟數據庫架構-—-—仙盟創夢IDE-CSDN博客接下載我們做一個更復雜的的其他場景由于,V1查詢字段必須 id接下來我們修改了了代碼JAVASCRIPT 前端數據庫-V2--仙盟數據庫架構-—-—仙盟創夢IDE-CS…

k8s核心資料基本操作

NamespaceNamespace是kubernetes系統中的一種非常重要資源,它的主要作用是用來實現多套環境的資源隔離或者多租戶的資源隔離。默認情況下,kubernetes集群中的所有的Pod都是可以相互訪問的。但是在實際中,可能不想讓兩個Pod之間進行互相的訪問…

PostgreSQL——分區表

分區表一、分區表的意義二、傳統分區表2.1、繼承表2.2、創建分區表2.3、使用分區表2.4、查詢父表還是子表2.5、constraint_exclusion參數2.6、添加分區2.7、刪除分區2.8、分區表相關查詢2.9、傳統分區表注意事項三、內置分區表3.1、創建分區表3.2、使用分區表3.3、內置分區表原…

Linux任務調度全攻略

Linux下的任務調度分為兩類,系統任務調度和用戶任務調度。系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日志清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。/etc/crontab文件包括下面…

回溯算法通關秘籍:像打怪一樣刷題

🚀 回溯算法通關秘籍:像打怪一樣刷題! 各位同學,今天咱們聊聊 回溯算法(Backtracking)。它聽起來玄乎,但其實就是 “暴力搜索 剪枝” 的優雅版。 打個比方:回溯就是在迷宮里探險&am…

嵌入式Linux常用命令

📟 核心文件與目錄操作pwd-> 功能: 打印當前工作目錄的絕對路徑。-> 示例: pwd -> 輸出 /home/user/projectls [選項] [目錄]-> 功能: 列出目錄內容。-> 常用選項:-l: 長格式顯示(詳細信息)-a: 顯示所有文件(包括隱…

深入理解 Linux 內核進程管理

在 Linux 系統中,進程是資源分配和調度的基本單位,內核對進程的高效管理直接決定了系統的性能與穩定性。本文將從進程描述符的結構入手,逐步剖析進程的創建、線程實現與進程終結的完整生命周期,帶您深入理解 Linux 內核的進程管理…

ACP(三):讓大模型能夠回答私域知識問題

讓大模型能夠回答私域知識問題 未經過特定訓練答疑機器人,是無法準確回答“我們公司項目管理用什么工具”這類內部問題。根本原因在于,大模型的知識來源于其訓練數據,這些數據通常是公開的互聯網信息,不包含任何特定公司的內部文檔…

使用Xterminal連接Linux服務器

使用Xterminal連接Linux服務器(VMware虛擬機)的步驟如下,前提是虛擬機已獲取IP(如 192.168.31.105)且網絡互通: 一、準備工作(服務器端確認)確保SSH服務已安裝并啟動 Linux服務器需要…

ChatBot、Copilot、Agent啥區別

以下內容為AI生成ChatBot(聊天機器人)、Copilot(副駕駛)和Agent(智能體/代理)是AI應用中常見的三種形態,它們在人機交互、自動化程度和任務處理能力上有著顯著的區別。特征維度ChatBot (聊天機器…

2025 年大語言模型架構演進:DeepSeek V3、OLMo 2、Gemma 3 與 Mistral 3.1 核心技術剖析

編者按: 在 Transformer 架構誕生八年之際,我們是否真的見證了根本性的突破,還是只是在原有設計上不斷打磨?今天我們為大家帶來的這篇文章,作者的核心觀點是:盡管大語言模型在技術細節上持續優化&#xff0…

基于Matlab GUI的心電信號QRS波群檢測與心率分析系統

心電信號(Electrocardiogram, ECG)是臨床診斷心臟疾病的重要依據,其中 QRS 波群的準確檢測對于心率分析、心律失常診斷及自動化心電分析系統具有核心意義。本文設計并實現了一套基于 MATLAB GUI 的心電信號處理與分析系統,集成了數…

1臺SolidWorks服務器能帶8-10人并發使用

在工業設計和機械工程領域,SolidWorks作為主流的三維CAD軟件,其服務器部署方案直接影響企業協同效率。通過云飛云共享云桌面技術實現多人并發使用SolidWorks時,實際承載量取決于硬件配置、網絡環境、軟件優化等多維度因素的綜合作用。根據專業…

String、StringBuilder和StringBuffer的區別

目錄一. String:不可變的字符串二.StringBuilder:可變字符串三.StringBuffer:線程安全的可變字符串四.總結在 Java 開發中,字符串處理是日常編碼中最頻繁的操作之一。String、StringBuilder 和 StringBuffer 這三個類雖然都用于操…