欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、spring依賴注入使用方式

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

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

注解處理器

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

注解處理器的激活條件

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

1.基于xml的spring配置

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

2.基于配置類的spring配置

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

總結(jié)

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

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

相關(guān)文章

  • java自定義枚舉轉(zhuǎn)換器示例

    java自定義枚舉轉(zhuǎn)換器示例

    這篇文章主要介紹了java自定義枚舉轉(zhuǎn)換器示例,需要的朋友可以參考下
    2014-05-05
  • Spring事務(wù)管理配置文件問(wèn)題排查

    Spring事務(wù)管理配置文件問(wèn)題排查

    這篇文章主要介紹了Spring事務(wù)管理配置文件問(wèn)題排查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring中的注解之@Override和@Autowired

    Spring中的注解之@Override和@Autowired

    看別人寫的代碼,經(jīng)常會(huì)用到 @Override 和 @Autowired 這兩個(gè)注解.這邊總結(jié)一下這兩個(gè)注解的作用,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • 基于Intellij Idea亂碼的解決方法

    基于Intellij Idea亂碼的解決方法

    下面小編就為大家分享一篇基于Intellij Idea亂碼的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Spring?web開(kāi)發(fā)教程之Request獲取3種方式

    Spring?web開(kāi)發(fā)教程之Request獲取3種方式

    這篇文章主要給大家介紹了關(guān)于Spring?web開(kāi)發(fā)教程之Request獲取3種方式的相關(guān)資料,request對(duì)象是從客戶端向服務(wù)器發(fā)出請(qǐng)求,包括用戶提交的信息以及客戶端的一些信息,需要的朋友可以參考下
    2023-11-11
  • 使用MyBatis查詢千萬(wàn)級(jí)數(shù)據(jù)量操作實(shí)現(xiàn)

    使用MyBatis查詢千萬(wàn)級(jí)數(shù)據(jù)量操作實(shí)現(xiàn)

    這篇文章主要為大家介紹了如何使用MyBatis?查詢千萬(wàn)數(shù)據(jù)量的操作過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java大文件上傳詳解及實(shí)例代碼

    Java大文件上傳詳解及實(shí)例代碼

    這篇文章主要介紹了Java大文件上傳詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 基于java swing實(shí)現(xiàn)答題系統(tǒng)

    基于java swing實(shí)現(xiàn)答題系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于java swing實(shí)現(xiàn)答題系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot如何返回頁(yè)面的實(shí)現(xiàn)方法

    SpringBoot如何返回頁(yè)面的實(shí)現(xiàn)方法

    SpringBoot中使用Controller和頁(yè)面的結(jié)合能夠很好地實(shí)現(xiàn)用戶的功能及頁(yè)面數(shù)據(jù)的傳遞。本文介紹了如何實(shí)現(xiàn)頁(yè)面的返回以及這里面所包含的坑,感興趣的可以了解一下
    2021-07-07
  • 簡(jiǎn)單了解Java類成員初始化順序

    簡(jiǎn)單了解Java類成員初始化順序

    這篇文章主要介紹了簡(jiǎn)單了解Java類成員初始化順序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論