日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Spring中存取Bean對象的相關注解

作者:忄烰燴 更新時間: 2022-11-14 編程語言

1.五大類注解

@Controller(控制器存儲)

@Service(服務儲存)

@Repository(倉庫儲存)

@Component(組件儲存)

@Configuration(配置儲存)


用法

首先要建立一Spring的項目,再創建一個相應的Controller類.

?然后在resources目錄下的xml文件加入這句,其中引號中的路徑要包函你想要存儲的Bean對象.

?@Controller:

?我們平常想在main方法中獲取這個UserController對象都是用new關鍵字創建一個的,但Spring就不一樣了,它是在程序運行加載好的基礎上去取到加載好的對象的.

?在獲取上下文之后就可以通過getBean()方法從IoC容器中獲取到Bean對象了.

?其他的注解的用法也是一樣的:

@Service:

代碼:

讀取Bean代碼:

?@Repository:

代碼:

讀取Bean代碼:

?@Component:

代碼:

讀取Bean代碼:

?@Configuration:

代碼:

讀取Bean代碼:

?2.方法注解:@Bean

首先我們要有一個類,例如

然后在另一個 類中創建一個對象并存儲到Spring容器中

?

?注意:@Bean標簽必須配合類標簽使用.

為什么@Bean必須配合類標簽使用呢?

這是程序員在設計的時候考慮到搜索的效率而設計的,只有通過注解標識了哪些路徑,Spring才認為被標記的路徑中有可能有要存到容器中的Bean對象,Spring才會去搜索那些被標記的路徑,不必全部路徑都搜索一遍,這樣就提高了效率,所以如果只標記方法注解,而沒有類注解,Spring是不會來搜索這個類的,就更別提搜索它里面的方法了.

獲取Bean對象代碼:

?但是假如在其他類下面也有一個方法名一樣的方法那就有問題了.

?你會發現在main方法中只能取到一個固定的對象,無法取到另一個.

不管運行多少次,你取到的都是"李四"這個對象,無法拿到"張三".

這時候就要用到Bean的重命名方法了

?

?

?這樣我們就能隨心所欲的取到想要的對象了

除了上面的命名方式,我們還有另外兩種方式

?但是Bean還有個問題,就是不能存儲帶參數的方法,因為在存儲Bean對象的時候,我們沒辦法手動給它傳參,所以無法存儲進去,如果要傳參可能得配合其他標簽讓他在存儲的時候自動傳參.

3獲取Bean對象的三種方法

1.屬性注入

2.setter方法注入

3.構造方法注入

1.屬性注入

獲取注入對象的代碼:

結果:

?2.setter注入

?獲取注入對象的代碼:

結果:

?也能成功調用.

3.構造方法調用

??獲取注入對象的代碼:

結果也是正常的:

當當前類只有一個構造方法的時候@Autowired標簽也能省略

但是當當前類有多個構造方法的時候?必須加一個,不然Spring就會報錯

?獲取注入對象的代碼:

?

?結果:

?

?所以有多個構造方法至少要加一個:

?修改之后得到正確結果

:

?雖然三個都能注入,但都有不同的優缺點:

屬性注入:

優點: 編碼方便快捷,代碼量少.

缺點:?1.可能只有Spring支持這種寫法,把代碼在別的框架上使用同樣的代碼可能會出錯.代碼通用性差.因為代碼簡短,濫用的成本低,被濫用的概率高.

2.不能注入不可變的對象,也就是被Java中被final修飾的對象.

Setter方法注入:

優點: 符合單一原則,一個Setter只針對一個對象.

缺點: 1.不能注入不可變的對象,也就是被Java中被final修飾的對象.

2.由于可以多次調用setter方法,所以注入的對象可能被改變.

構造方法注入:

優點:1.符合單一原則,因為一個構造方法只會調用一次,所以相同對象只會存儲一次.

2.注入的對象會被完全初始化,因為構造方法是對象在建立之初就執行的,所以在執行的時候能將對象完全初始化.

3.通用性會更好,因為構造方法是屬于JDK所支持的,其他兩種注入方式IoC容器才支持的.

4.可以注入不可變對象,對final修飾的對象有兩種初始化的方法,一種是在創建的時候直接毒賦值,一種是在構造方法里賦值,所以構造方法注入剛好滿足這種情況.

??3.1@Resource注解

@Resource和@Autowried的使用方法都差不多,但是@Resource提供的方法更多

@Resource是可以直接替換@Autowried的

?

但是只能屬性注入的方式和setter注入的方式能用,因為構造方法的執行時機與@Resource不同,構造方法在創建對象時就執行,但是@Resource注解的執行時機在構造方法之后.

與@Autowried的區別

?@Resource比@Autowried多了很多參數設置

除此之外@Resource是JDK自帶的注解,而@Autowried來自Spring.

3.2同類型有多個@Bean報錯

?在另一個類中獲取User對象

?運行之后:

?多個同類型@Bean解決辦法

1.@Resource(name = "XXX")定義

2.@Qualifier注解定義名稱

?

?或者

?

原文鏈接:https://blog.csdn.net/qq_62592809/article/details/127832405

欄目分類
最近更新