成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

@Autowired和@Resource到底什么區別,你明白了嗎?

開發 前端
根據 Property 的 name 自動裝配,如果一個 Bean 的 name 和另一個 Bean 中的 Property 的 name 相同,則自動裝配這個 Bean 到 Property 中。

阿粉相信,大家做 Java 開發的,肯定對于 Spring 是非常熟悉的,而且面試的時候,也相信大家能夠非常輕易的知道這個所有的關于 Spring 的面試題,比如 Spring 的注入什么的。也肯定會被問到 @Autowired 和 @Resource 到底用哪個比較適合,今天阿粉就來講講這個注入的注解是個什么區別。

@Autowired

@Autowired顧名思義,就是自動裝配,而它的作用是為了消除代碼Java代碼里面的 getter/setter 與 bean 屬性中的 property 。

當然,getter看個人需求,如果私有屬性需要對外提供的話,應當予以保留。

也有很多面試官喜歡詢問,Spring 的自動裝配你了解么?其實問的也是這個注解,而這個注解中有幾個屬性,需要大家知道。

  • no

默認值,表示不使用自動裝配,Bean 依賴必須通過 ref 元素定義。

  • byName

根據 Property 的 name 自動裝配,如果一個 Bean 的 name 和另一個 Bean 中的 Property 的 name 相同,則自動裝配這個 Bean 到 Property 中。(表示按屬性名稱自動裝配,XML 文件中 Bean 的 id 必須與類中的屬性名稱相同)

  • byType

根據 Property 的數據類型(Type)自動裝配,如果一個 Bean 的數據類型兼容另一個 Bean 中 Property 的數據類型,則自動裝配。(XML 文件中 Bean 的 id 與類中的屬性名稱可以不同,但必須只有一個類型的 Bean。)

  • constructor

類似于 byType,根據構造方法參數的數據類型,進行 byType 模式的自動裝配。(類中構造函數的參數必須在配置文件中有相同的類型)

  • autodetect(3.0版本不支持)

如果 Bean 中有默認的構造方法,則用 constructor 模式,否則用 byType 模式。

其實這些參數都指明了一件事情,這個 @Autowired 的注解,就是根據 type 也就是類型來進行裝配,與之而來的就是 @Resource 他又是什么呢?

@Resource

官方描述為,一般用在類屬性或者setter方法上聲明屬性需要自動裝配。

如果在Resource注解中指定了bean的名稱,則Spring會只按注解中的bame屬性查找合適對象,然后進行裝配。如果注解中沒有指定名稱,先按類屬性的變量名查找,如果還是未找到,則按類型進行查找。

它的內部也有屬性:

  • name

定義了name屬性的值, 就只按照name值匹配,使用byName的自動注入策略

  • type

定義了type屬性的值, 就只按照type值匹配,使用byType的自動注入策略

如果你不指定的話,他自己會默認使用反射機制,使用byName自動注入策略。

那么面試官的問題就來了,@Autowired 和 @Resource 的區別在哪呢?什么時候選擇用什么才合適呢?

@Autowired 和 @Resource 的區別

1.包就不一樣

@Autowired 是Spring提供的。

@Resource 是J2EE提供的。也就是Java規范的。

2.裝配的默認類型不一樣

@Autowired只按type裝配。

@Resource默認是按name裝配。

@Autowired默認按類型裝配,默認情況下必須要求依賴對象存在,如果要允許null值,可以設置它的required屬性為false。

如果想使用名稱裝配可以結合@Qualifier注解進行使用。

而默認按照名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行名稱查找。

如果注解寫在setter方法上默認取屬性名進行裝配。當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

那么我們選擇哪一種最好呢?

其實大家在開發的時候,有沒有注意到一個地方,就是 IDEA 有時候還會在 @Autowired 注解上面Field injection is not recommended (字段注入是不被推薦的)這個警告,雖然并不屬于報錯,但是確實是警告的存在。但是 @Resource 就不會呢?

其實有很多人也說不上來為啥,阿粉個人感覺,@Autowired是Spring提供的,它是特定IoC提供的特定注解,這就導致了應用與框架的強綁定,一旦換用了其他的IoC框架,是不能夠支持注入的。

而 @Resource是 Java 自己提供的,它是Java標準,我們使用的IoC容器應當去兼容它,這樣即使更換容器,也可以正常工作。

那么為什么還有這么多的人使用的都是 @Autowired 注解呢?

那就只有兩個字了,簡單,使用構造器或者setter注入需要寫更多業務無關的代碼,十分麻煩,而字段注入大幅簡化了它們。并且絕大多數情況下業務代碼和框架就是強綁定的,完全松耦合只是一件理想上的事,犧牲了敏捷度去過度追求松耦合反而得不償失。

所以,你知道他們的區別是什么了么?

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2022-08-29 07:05:02

JSRJava語言

2023-02-17 08:02:45

@Autowired@Resource

2022-10-08 00:24:40

嵌套事務加入事務事務

2024-03-05 18:19:07

localhostLinux數據庫

2022-08-16 07:32:03

RestfulSOAPRPC

2022-12-30 08:35:00

2022-05-04 08:38:32

Netty網絡框架

2021-09-06 10:45:18

XDRMDR

2024-02-26 07:36:09

lockJava語言

2024-02-04 00:00:00

@ValidSpring@Validated

2015-09-18 09:17:06

數據分析

2022-07-18 07:11:35

請求轉發請求重定數據共享

2022-10-27 19:32:20

切片golang數組

2024-04-12 00:00:00

localhost計算機機制

2022-08-26 01:41:42

GPUCPU架構

2023-10-23 07:36:25

@ResourceAutowiredjavax

2024-05-30 08:19:52

微服務架構大型應用

2023-07-19 21:54:02

小區扇區信號

2019-04-23 08:23:51

統計學機器學習人工智能

2021-11-07 14:34:26

跨域網絡后端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜国产一级 | 国产精品视频一区二区三 | 91精品国产一区 | 国产成人精品在线播放 | av永久免费 | 伊人网站视频 | 久久国产福利 | 成人日b视频 | 欧美视频区| 91在线看片| 91丨国产| 天堂亚洲网 | 日本欧美黄色片 | 超碰欧美 | 国产成人在线一区二区 | 日操操夜操操 | 91tv在线观看 | 欧美精品久久久久 | 91久久夜色精品国产网站 | 国产原创在线观看 | 久久精品国产亚洲 | 成人在线精品视频 | 成人精品在线观看 | 欧美一级片免费看 | 精品粉嫩aⅴ一区二区三区四区 | 一区二区三区成人 | 一区二区三区四区在线 | 欧美天堂 | 免费色网址 | 国产精品久久久久久亚洲调教 | 超级乱淫av片免费播放 | 免费不卡一区 | 国产一区2区| 91综合网 | 久久久久久成人网 | 国产人免费人成免费视频 | 亚洲欧美一区二区三区国产精品 | 久久久久久国产精品mv | 精品1区2区3区 | 亚洲日本激情 | 欧美五月婷婷 |