最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實現(xiàn)原理

 更新時間:2019年06月14日 09:33:46   作者:本人禿頂程序員  
這篇文章主要介紹了詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、spring依賴注入使用方式

  • @Autowired是spring框架提供的實現(xiàn)依賴注入的注解,主要支持在set方法,field,構(gòu)造函數(shù)中完成bean注入,注入方式為通過類型查找bean,即byType的,如果存在多個同一類型的bean,則使用@Qualifier來指定注入哪個beanName的bean。
  • 與JDK的@Resource的區(qū)別:@Resource是基于bean的名字,即beanName,來從spring的IOC容器查找bean注入的,而@Autowried是基于類型byType來查找bean注入的。
  • 與JDK的@Inject的區(qū)別:@Inject也是基于類型來查找bean注入的,如果需要指定名稱beanName,則可以結(jié)合使用@Named注解,而@Autowired是結(jié)合@Qualifier注解來指定名稱beanName。

二、spring依賴注入注解的實現(xiàn)原理

注解處理器

  • 在spring框架內(nèi)部實現(xiàn)當(dāng)中,注解實現(xiàn)注入主要是通過bean后置處理器BeanPostProcessor接口的實現(xiàn)類來生效的。BeanPostProcessor后置處理器是在spring容器啟動時,創(chuàng)建bean對象實例后,馬上執(zhí)行的,對bean對象實例進(jìn)行加工處理。
  • @Autowired是通過BeanPostProcessor接口的實現(xiàn)類AutowiredAnnotationBeanPostProcessor來實現(xiàn)對bean對象對其他bean對象的依賴注入的;
  • @Resource和@Inject是通過BeanPostProcessor接口的實現(xiàn)類CommonAnnotationBeanPostProcessor來實現(xiàn)的,其中如名字所述,即公共注解CommonAnotation,CommonAnnotationBeanPostProcessor是spring中統(tǒng)一處理JDK中定義的注解的一個BeanPostProcessor。該類會處理的注解還包括@PostConstruct,@PreDestroy等。

注解處理器的激活條件

  • AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor添加到spring容器的BeanPostProcessor的條件,即激活這些處理器的條件如下:

1.基于xml的spring配置

  • 在對應(yīng)的spring容器的配置xml文件中,如applicationContext.xml,添加<context:annotation-config />和<context:component-scan />,或者只使用<context:component-scan />。
  • 兩者的區(qū)別是<context:annotation-config />只查找并激活已經(jīng)存在的bean,如通過xml文件的bean標(biāo)簽生成加載到spring容器的,而不會去掃描如@Controller等注解的bean,查找到之后進(jìn)行注入;而<context:component-scan />除了具有<context:annotation-config />的功能之外,還會去加載通過basePackages屬性指定的包下面的,默認(rèn)為掃描@Controller,@Service,@Component,@Repository注解的類。不指定basePackages則是類路徑下面,或者如果使用注解@ComponentScan方式,則是當(dāng)前類所在包及其子包下面。

2.基于配置類的spring配置

  • 如果是基于配置類而不是基于applicationContext.xml來對spring進(jìn)行配置,如SpringBoot,則在內(nèi)部使用的IOC容器實現(xiàn)為AnnotationConfigApplicationContext或者其派生類,在AnnotationConfigApplicationContext內(nèi)部會自動創(chuàng)建和激活以上的BeanPostProcessor。
  • 如果同時存在基于xml的配置和配置類的配置,而在注入時間方面,基于注解的注入先于基于XML的注入,所以基于XML的注入會覆蓋基于注解的注入。

總結(jié)

  • @Autowired是Spring自帶的,@Inject和@Resource都是JDK提供的,其中@Inject是JSR330規(guī)范實現(xiàn)的,@Resource是JSR250規(guī)范實現(xiàn)的,而Spring通過BeanPostProcessor來提供對JDK規(guī)范的支持。
  • @Autowired、@Inject用法基本一樣,不同之處為@Autowired有一個required屬性,表示該注入是否是必須的,即如果為必須的,則如果找不到對應(yīng)的bean,就無法注入,無法創(chuàng)建當(dāng)前bean。
  • @Autowired、@Inject是默認(rèn)按照類型匹配的,@Resource是按照名稱匹配的。如在spring-boot-data項目中自動生成的redisTemplate的bean,是需要通過byName來注入的。如果需要注入該默認(rèn)的,則需要使用@Resource來注入,而不是@Autowired。
  • 對于@Autowire和@Inject,如果同一類型存在多個bean實例,則需要指定注入的beanName。@Autowired和@Qualifier一起使用,@Inject和@Name一起使用。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中關(guān)于子類覆蓋父類的拋出異常問題

    Java中關(guān)于子類覆蓋父類的拋出異常問題

    今天小編就為大家分享一篇關(guān)于Java中關(guān)于子類覆蓋父類的拋出異常問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • SpringBoot項目與Nacos配置全過程

    SpringBoot項目與Nacos配置全過程

    本文介紹了如何在SpringBoot項目中使用Nacos作為配置中心,實現(xiàn)動態(tài)配置管理和實時更新配置的能力,通過配置命名空間和yml文件,創(chuàng)建SpringBoot項目并添加Nacos依賴,編寫Controller和啟動類,配置Tomcat啟動程序,最終在Nacos服務(wù)端注冊成功
    2024-11-11
  • Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實現(xiàn)

    Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實現(xiàn)

    這篇文章主要介紹了Java 添加、修改、讀取、復(fù)制、刪除Excel批注的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 詳解安裝Eclipse Maven插件的幾種方法

    詳解安裝Eclipse Maven插件的幾種方法

    本篇文章主要介紹了詳解安裝Eclipse Maven插件的幾種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Lombok使用@Tolerate實現(xiàn)沖突兼容問題

    Lombok使用@Tolerate實現(xiàn)沖突兼容問題

    這篇文章主要介紹了Lombok使用@Tolerate實現(xiàn)沖突兼容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 簡單實現(xiàn)Java驗證碼功能

    簡單實現(xiàn)Java驗證碼功能

    這篇文章主要為大家詳細(xì)介紹了簡單實現(xiàn)Java驗證碼功能的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java中復(fù)雜的Synchronized關(guān)鍵字使用方法詳解

    Java中復(fù)雜的Synchronized關(guān)鍵字使用方法詳解

    Synchronized關(guān)鍵字是一個種鎖,其有很多名字,例如重量級鎖、悲觀鎖、可重入鎖、、非公平、對象鎖等等,這篇文章主要給大家介紹了關(guān)于Java中復(fù)雜的Synchronized關(guān)鍵字使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java動態(tài)加載類示例詳解

    Java動態(tài)加載類示例詳解

    這篇文章主要給大家介紹了關(guān)于Java動態(tài)加載類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Spring?Security?基于URL的權(quán)限判斷源碼解析

    Spring?Security?基于URL的權(quán)限判斷源碼解析

    這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問題,我們想要實現(xiàn)自己的基于請求Url的授權(quán)只需自定義一個?AccessDecisionManager即可,接下來跟隨小編一起看看實現(xiàn)代碼吧
    2021-12-12
  • spring?boot集成p6spy的最佳實踐

    spring?boot集成p6spy的最佳實踐

    這篇文章主要介紹了spring?boot集成p6spy的最佳實踐-p6spy-spring-boot-starter的項目案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02

最新評論

恩平市| 济阳县| 新绛县| 中阳县| 溆浦县| 中西区| 洞口县| 浮山县| 三门峡市| 东兰县| 六盘水市| 晋州市| 华宁县| 衡水市| 兴文县| 奉节县| 乐都县| 泾川县| 普定县| 图木舒克市| 平邑县| 南召县| 奎屯市| 安远县| 山阳县| 马龙县| 西丰县| 建阳市| 壤塘县| 新闻| 青川县| 斗六市| 正宁县| 司法| 泰来县| 鄂托克旗| 汤原县| 涿鹿县| 边坝县| 崇明县| 台湾省|