【Spring】 IoCDI

?回顧

企業命名規范

大駝峰:BookDao(首字母都大寫)

類名

小駝峰:bookDao(第一個字母小寫)

方法名

蛇形:book_dao(小寫+下劃線_)

數據庫

串形:book-dao(小寫+連字符-)

項目文件夾

各種注解

學習Spring MVC, 其實就是學習各種Web開發需要?的到注解

a. @RequestMapping: 路由映射

b. @RequestParam: 后端參數重命名

c. @RequestBody: 接收JSON類型的參數

d. @PathVariable: 接收路徑參數

e. @RequestPart: 上傳?件

f. @ResponseBody: 返回數據

g. @CookieValue: 從Cookie中獲取值

h. @SessionAttribute: 從Session中獲取值

i. @RequestHeader: 從Header中獲取值

?j. @Controller: 定義?個控制器, Spring 框架啟動時加載, 把這個對象交給Spring管理. 默認返回 視圖.

k. @RestController: @ResponseBody + @Controller 返回數據

好用的工具插件

Java EE學習階段會涉及較多?具, 插件的學習, 來幫助我們提?開發效率. ?如Postman, lombok, EditStarter, 后?還會繼續學習其他的?具或插件.?

一.Spring

Spring兩大核心思想

1.IoC

2.AOP

1.IoC控制反轉

Inversion of Control 控制反轉,Spring是一個控制反轉的容器.(spring擁有了創建對象的控制權)

舉一個例子來理解什么是控制反轉?

我們要造一輛汽車,汽車依賴車身,車身依賴底盤,底盤依賴輪子.

由于層層的依賴關系,程序的耦合度非常高,此時如果我們想改變位于底層的輪胎的大小,或者增加輪胎的屬性,整個調用鏈上的所有代碼都需要修改.這當然是是一個問題.

如果我們轉變思路:先根據汽車的樣子設計車身,再根據車身設計底盤,根據底盤設計輪子. 這個時候,他們的依賴關系就完全倒置了: 輪子依賴底盤,底盤依賴車身,車身依賴汽車.

實現:將所需要的依賴從原來創建下級類的方式改為傳遞/注入的方式,此時我們不需要關注下級類的屬性變化,傳遞過來的是什么,我們就接受什么,此類本身并不需要修改代碼.這也完成了程序的解耦!

IoC方式和傳統方式的對比

傳統開發對象的創建順序: Car? -? FrameWork -? Bottom? -? Tire

改進之后的創建對象順序:Tire? -? Bottom? -? Framework? -? Car

改進之后的控制權發生了反轉,不再是使用方對象創建并控制依賴對象了,而是把依賴對象注入到當前對象中,依賴對象的控制權不再由當前類控制.

這也就是IoC的實現思想.


IoC容器的優點

資源不再由使用雙方管理,而是由第三方管理

1.資源集中管理:IoC容器會幫我們管理一些資源對象,需要時,去容器中去取就可以了

2.解耦合:降低了使用資源雙方的依賴程度,創建實例的時候不需要了解其中的細節

總結:Spring是一個包含眾多工具的IoC容器,來幫助我們做資源管理.

IoC是一種思想,DI是IoC的一種實現方法.

2.DI依賴注入

Dependency Injection依賴注入

容器在運行期間,動態地為應用程序提供運行時所依賴的資源.

上述代碼中就是通過構造函數的方式,把依賴對象注入到使用的對象中.

二.IoC 和 DI 的使用

Spring作為一個IoC容器,它具備兩個最基礎的功能,那就是存和取;

存和取的其實就是spring容器幫管我們管理的對象,我們把他們稱之為Bean.

這些對象交由Spring管理,由Spring來負責對象的創建和銷毀.

我們要做的分兩步:

1.告訴Spring,哪些需要存

添加@Component注解(例)

2.知道如何從Spring取出對象

添加注解@Autowired

比如:

原本在UserController類中要使用UserDao對象,就需要new出UserDao對象,但是現在我們也可以將UserDao交給Spring管理了, 具體的實現只需要兩步 :?

1.告訴Spring幫我們管理UserDao?

在類上面添加@Component注解

2.從Spring中獲取UserDao對象

在對象聲明時添加@Autowired注解

Bean的存儲

上述IoC容器創建和管理對象的過程也就是bean的存儲.

前面我們使用的是@Component注解來把對象交給IoC容器管理,而Spring框架為了更好服務web應用程序,提供了更更富的注解.

1.類注解(五大注解)

@Controller

控制層存儲

@Service

服務存儲

@Repository

倉庫存儲

@Component

組件存儲

@Configuration

配置存儲

1.1@Controller

使用@Controller存儲bean:
?

從Spring上下文中獲取bean對象的三種方式:

先獲取到Spring上下文,再調用getBean方法.

  • getBean(Class)

  • getBean(String s)

這種要強轉 .

特殊情形:如果類名前兩位都是大寫,那么不用變,直接使用原名

  • getBean(String , Class)

bean名的約定

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

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

類名: AccountService, Bean的名稱為: accountService

特殊情況, 當有多個字符并且第?個和第?個字符都是?寫時, 將保留原始的??寫.

?如

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

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

1.2@Service

1.3@Repository

1.4@Component

1.5@Configuration

上述四個注解和@Controller也是相同的使用方法.

為什么要這么多注解

其實注解和分層式呼應的.不同的注解對應不同的用途.

  • @Controller:控制層, 接收請求, 對請求進?處理, 并進?響應.
  • ?@Servie:業務邏輯層, 處理具體的業務邏輯.
  • @Repository:數據訪問層,也稱為持久層. 負責數據訪問操作
  • ?@Configuration:配置層. 處理項?中的?些配置信息

注解之間的關系

  • @Controller / @Service / @Repository / @Configuration 這四個注解的源碼里都有一個@Component , 說明它們本身就是屬于@Component的 " 子類 " ,@Component 是?個元注解,@Controller , @Service , @Repository 等. 這些注解被稱為 @Component 的衍?注解.
  • @Controller , @Service 和 @Repository ?于更具體的?例(分別在控制層, 業務邏輯層, 持 久化層), 在開發過程中, 如果你要在業務邏輯層使? @Component 或@Service,顯然@Service是更 好的選擇.
  • 只有@controller注解才可以被其他類訪問到,這是controller的特殊功能.

ApplicationContext? 和 BeanFactory

BeanFactory

獲取bean對象其實是父類BeanFactory提供的功能.

  • 它們都是Spring容器的的頂級接口,其實BeanFactory提供了基礎的訪問容器的能力,ApplicationContext屬于BeanFactory的子類,繼承了BeanFactory的所有功能,并且還擁有獨立的特性,添加了國際化支持/資源訪問支持/時間傳播

  • 性能:applicationContext是一次性加載并初始化所有Bean對象,而BeanFactory是懶加載,需要用到才會去加載,因此更輕量.

2.方法注解@bean

五大注解只能加載類上,并且只能加在自己的代碼上

若想獲取一個類的多個bean時,不能使用類型來獲取對象. 否則會取到同一個對象.

2.1獲取第三方類

由于五大注解只能加在自己寫的類上,對于一些第三方的包,我們只能通過方法注解來獲取第三方類

假如這是一個第三方類:

  • 方法注解必須搭配五大注解使用!

  • 一個類包含多個bean,只能使用bean名稱獲取

2.2bean傳參

Bean會根據名稱匹配. 但是如果對應類型的對象只有一個時,就不會看名稱,而是直接賦值 .

(比如只有一個String類型的bean,此時參數就是一個String類型,那么就會直接用這個唯一的String類型的bean,而不會看名稱匹配)


springBoot特點有一個特點是約定大于配置

體現:掃描路徑

默認的掃描路徑是啟動類所在目錄以及子目錄.

另外,@ComponentScan("") 可以指定掃描路徑.

如果沒有指定,使用默認的掃描路徑.

三.DI詳解

依賴注入/屬性裝配

1.屬性注入@Autowired

屬性注入以類型進行匹配,與注入的屬性名稱無關

注意:無法注入final修飾的屬性.

@Autowired的問題:如果一個類型存在多個對象,優先名稱匹配,如果名稱都匹配不上,那就會報錯.

解決方式:

1.屬性名和需要使用的對象名保持一致.(使用名稱匹配)

2.使用@Primary注解表示默認的bean

3.使用@Qualifier來指定bean

4.使用@Resource來指定bean

@Autowired和@Resouce的區別

  • @Autowired是spring框架的注解,而@Resource是JDK提供的注解.
  • @Autowried是默認是按照類型注入,如果類型一樣,優先按照名稱匹配,而@Resource是按照名稱注入,它可以設置name屬性來獲取bean

2.構造方法注入

如果只有一個構造函數,@Autowired可以省略

如果存在多個構造方法,需要加@Autowired注明使用哪個構造方法

3.Setter方法注入

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

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

相關文章

[Linux] shell腳本的函數和數組

一、函數 1.1 函數的定義 函數是腳本的別名 作用:函數可以避免代碼重復,可讀性強,可以簡化腳本。 格式:函數名(){腳本} 1.2 如何使用函數 1.定義 2.調用 函數一定要先定義再使用 例子&#xff1a…

編譯原理Lab1-用FLEX構造C-Minus-f詞法分析器

HNU編譯原理lab1實驗–根據cminux-f的詞法補全lexical_analyer.l文件,完成詞法分析器。 本文沒有添加任何圖片,但是以復制輸出的形式展現出來了實驗結果。 實驗要求: 根據cminux-f的此法補全lexical_analyer.l文件,完成詞法分析…

國家超級計算濟南中心低代碼平臺應用實踐

摘要:文章主要介紹了濟南超算使用低代碼平臺明道云解決了一系列業務問題,包括資產管理、人員與機構管理、流程制度管理等。通過明道云平臺,濟南超算成功地將不同部門的業務信息進行整合,提高了工作效率和管理水平。文章還強調了明…

計算機端口

前言 計算機端口(Port)是一種用于在計算機網絡中標識特定服務或應用程序的機制。 端口是一個數字,范圍從0到65535,用于將網絡通信分配給不同的應用程序或服務。 在 Internet 協議套件(TCP/IP)中&#xff0…

MG-HSF

作者未提供代碼

Go語言中結構體的使用和示例

結構體(簡稱struct)用于創建不同數據類型的成員集合,放入一個單一的變量中。雖然數組用于將相同數據類型的多個值存儲在單一變量中,但結構體用于將不同數據類型的多個值存儲在單一變量中。結構體對于將數據組合在一起以創建記錄非…

openGL之紋理 :第二課

#include "glew.h" #include "glfw3.h" #include "SOIL2.h"//如何解析輸入的數據流 0,1,2 分三部分 GLchar * vertextSrc " #version 330 core \n \layout (location 0) in vec3 position; \layout (location 1) in vec3 col…

【精選】??通道熱點加持的LW-ResNet:小麥病害智能診斷與防治系統

1.研究背景與意義 小麥是世界上最重要的糧食作物之一,但由于病害的侵襲,小麥產量和質量受到了嚴重的威脅。因此,開發一種高效準確的小麥病害識別分類防治系統對于保障糧食安全和農業可持續發展具有重要意義。 傳統的小麥病害識別分類方法主…

Feign

目錄 RestTemplate方式調用存在的問題: 定義和使用Feign客戶端 自定義Feign的配置 性能優化 Feign的最佳實踐 Feign的使用步驟: 1、引入依賴 2、添加EnableFeignClients注解 3、編寫FeignClient接口 4、使用FeignClient中定義的方法代替RestTemplate Feign的…

什么是遷移學習

1 遷移學習概述 遷移學習(Transfer Learning)是機器學習中的一種方法,它允許模型將從一個任務中學到的知識應用到另一個相關的任務中。這種方法在數據稀缺的情況下尤為有用,因為它減少了對大量標記數據的需求。遷移學習已成為深度…

Node使用Nvm安裝雙版本切換(node兩個版本同時用怎么辦?不同的項目Node版本要求不一樣怎么辦?)

先把node.js卸載 開始—>添加刪除程序—>node npm -v node -v //檢查是否還存在,卸載成功就行了NVM下載 github下載 百度網盤下載 打開安裝包以管理員身份安裝,要是記得這個路徑并且必須全是英文 使用nvm安裝兩個使用的node版本 cmd以管理員…

計算機組成原理2

1.浮點數 2.IEEE 754 3.存儲器的性能指標 4.存儲器的層次化結構 主存類似手機運行內存8g ,輔存類似手機內存128g.... 輔存必須先通過主存才能被cpu接收,就例如微信打開那個月亮小人界面兩三秒就是主存在讀取輔存的程序然后被cpu接收運行。 5.主存儲…

Greenplum的數據庫年齡檢查處理

概述 Greenplum是基于Postgresql數據庫的分布式數據庫,而PG數據庫在事務及多版本并發控制的實現方式上很特別,采用的是遞增事務id的方法,事務id大的事務,認為比較新,反之事務id小,認為比較舊。 事務id的上…

經典的回溯算法題leetcode組合問題整理及思路代碼詳解

目錄 組合問題 leetcode77題.組合 leetcode216題.組合總和III leetcode40題.組合總和II leetcode39題.組合總和 倘若各位不太清楚回溯算法可以去看我上一篇文章。 回溯算法詳解-CSDN博客 組合問題 一般組合和排列類的問題我們都會轉化成一個樹形問題,更便于…

26. 刪除有序數組中的重復項(remove-duplicates-from-sorted-array)

26. 刪除有序數組中的重復項(remove-duplicates-from-sorted-array) 給你一個 非嚴格遞增排列 的數組 nums ,請你** 原地** 刪除重復出現的元素,使每個元素 只出現一次 ,返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回 …

批量創建表空間數據文件(DM8:達夢數據庫)

DM8:達夢數據庫 - - 批量創建表空間數據文件 環境介紹1 批量創建表空間SQL2 達夢數據庫學習使用列表 環境介紹 在某些場景(分區表子表)需要批量創建表空間,給不同的表使用,以下代碼是批量創建表空間的SQL語句; 1 批量創建表空間SQL --創建 24個數據表空間,每個表空間有3個數…

強化學習小筆記 —— 如何選擇合適的更新步長

在強化學習中,動作價值函數的更新可以使用增量法,如下所示: Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k ? 1 r i ) 1 k ( r k ( k ? 1 ) Q k ? 1 ) 1 k ( r k k Q k ? 1 ? Q k ? 1 ) Q k ? 1 1 k [ r k ? Q k ? 1 ] \beg…

Linux寶塔面板搭建Discuz論壇, 并內網穿透實現公網訪問

Linux寶塔面板搭建Discuz論壇, 并內網穿透實現公網訪問 文章目錄 Linux寶塔面板搭建Discuz論壇, 并內網穿透實現公網訪問前言1.安裝基礎環境2.一鍵部署Discuz3.安裝cpolar工具4.配置域名訪問Discuz5.固定域名公網地址6.配置Discuz論壇 📷 江池…

低代碼平臺推薦:五大低代碼廠商誰的模式更“合適”

隨著數字化時代的到來,低代碼開發平臺作為提高數字生產力的工具正受到越來越多企業的關注,市面上的低代碼產品和廠商更是“亂花漸欲迷人眼”。 各家產品不僅功能各有不同,甚至商機都有區別的情況,如何做好產品選型已然成了采購企…

C語言——指針(一)

📝前言 這篇文章主要帶大家初步認識一下指針,供大家理解參考。 主要歸納與講解: 1,指針與指針變量 2,指針的基本使用(如何定義,初始化,引用) 🎬個人簡介&…