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

Spring注解Autowired的底層實(shí)現(xiàn)原理詳解

 更新時(shí)間:2022年10月27日 09:25:58   作者:無解的黑眼圈  
從當(dāng)前springboot的火熱程度來看,java?config的應(yīng)用是越來越廣泛了,在使用java?config的過程當(dāng)中,我們不可避免的會(huì)有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是@Autowired注解了。本文就來聊聊Autowired的底層實(shí)現(xiàn)原理

一、Autowired注解的用法

1、概述

使用spring開發(fā)時(shí),進(jìn)行配置主要有兩種方式,一是xml的方式,二是java config的方式。

spring技術(shù)自身也在不斷的發(fā)展和改變,從當(dāng)前springboot的火熱程度來看,java config的應(yīng)用是越來越廣泛了,在使用java config的過程當(dāng)中,我們不可避免的會(huì)有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是@Autowired注解了。這個(gè)注解的功能就是為我們注入一個(gè)定義好的bean

2、應(yīng)用

應(yīng)用與構(gòu)造方法注入

應(yīng)用與setter方法注入

應(yīng)用與屬性注入

3、具體用法

@Autowired

替換:autowire屬性,自動(dòng)裝配(按照類型裝配,通過set方法,且方法可以省略)

位置:修飾屬性,set方法

語(yǔ)法:@Autowired(required="true")

注意:

1.如果容器中沒有一個(gè)可以與之匹配且required屬性為true則會(huì)報(bào)異常NoSuchBeanDefinitionException

2.如果容器中有多個(gè)可以類型可以與之匹配,則自動(dòng)切換為按照名稱裝配

3.如果容器中有多個(gè)可以類型可以與之匹配,則自動(dòng)切換為按照名稱裝配,如果名稱也沒有匹配,則報(bào)異常NoUniqueBeanDefinitionException

二、Autowired自動(dòng)裝配的過程

首先要清楚java注解的核心其實(shí)時(shí)反射

1、在Spring源代碼當(dāng)中,Autowired注解位于包org.springframework.beans.factory.annotation之中,該包的內(nèi)容如下:

核心代碼如下

private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) {
  LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<>();
  Class<?> targetClass = clazz;//需要處理的目標(biāo)類
       
  do {
   final LinkedList<InjectionMetadata.InjectedElement> currElements = new LinkedList<>();
 
            /*通過反射獲取該類所有的字段,并遍歷每一個(gè)字段,并通過方法findAutowiredAnnotation遍歷每一個(gè)字段的所用注解,并如果用autowired修飾了,則返回auotowired相關(guān)屬性*/  
 
   ReflectionUtils.doWithLocalFields(targetClass, field -> {
    AnnotationAttributes ann = findAutowiredAnnotation(field);
    if (ann != null) {//校驗(yàn)autowired注解是否用在了static方法上
     if (Modifier.isStatic(field.getModifiers())) {
      if (logger.isWarnEnabled()) {
       logger.warn("Autowired annotation is not supported on static fields: " + field);
      }
      return;
     }//判斷是否指定了required
     boolean required = determineRequiredStatus(ann);
     currElements.add(new AutowiredFieldElement(field, required));
    }
   });
            //和上面一樣的邏輯,但是是通過反射處理類的method
   ReflectionUtils.doWithLocalMethods(targetClass, method -> {
    Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
    if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {
     return;
    }
    AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod);
    if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {
     if (Modifier.isStatic(method.getModifiers())) {
      if (logger.isWarnEnabled()) {
       logger.warn("Autowired annotation is not supported on static methods: " + method);
      }
      return;
     }
     if (method.getParameterCount() == 0) {
      if (logger.isWarnEnabled()) {
       logger.warn("Autowired annotation should only be used on methods with parameters: " +
         method);
      }
     }
     boolean required = determineRequiredStatus(ann);
     PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);
                   currElements.add(new AutowiredMethodElement(method, required, pd));
    }
   });
    //用@Autowired修飾的注解可能不止一個(gè),因此都加在currElements這個(gè)容器里面,一起處理  
   elements.addAll(0, currElements);
   targetClass = targetClass.getSuperclass();
  }
  while (targetClass != null && targetClass != Object.class);
 
  return new InjectionMetadata(clazz, elements);
 }

總結(jié):

Spring對(duì)@autowired注解的實(shí)現(xiàn)邏輯位于類:AutowiredAnnotationBeanPostProcessor(后置處理器)。@Autowied的本質(zhì)就是new對(duì)象,因?yàn)閟pring的核心思想就是IOC,只是將控制權(quán)反轉(zhuǎn)給了Spring框架,由它在底層通過注解或者配置文件幫我們new對(duì)象。

到此這篇關(guān)于Spring注解Autowired的底層實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)Spring注解Autowired內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決IDEA中不能正常輸入光標(biāo)變粗的問題

    解決IDEA中不能正常輸入光標(biāo)變粗的問題

    這篇文章主要介紹了在IDEA中不能正常輸入光標(biāo)變粗的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • Java全面細(xì)致講解類與對(duì)象

    Java全面細(xì)致講解類與對(duì)象

    類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-05-05
  • IDEA性能優(yōu)化方法解決卡頓問題

    IDEA性能優(yōu)化方法解決卡頓問題

    本文主要介紹了如何在不升級(jí)電腦配置的情況下通過修改IntelliJIDEA的設(shè)置來優(yōu)化其性能,從而提升開發(fā)效率
    2024-12-12
  • 淺談Spring Boot 開發(fā)REST接口最佳實(shí)踐

    淺談Spring Boot 開發(fā)REST接口最佳實(shí)踐

    這篇文章主要介紹了淺談Spring Boot 開發(fā)REST接口最佳實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • RocketMQ中的消費(fèi)模式和消費(fèi)策略詳解

    RocketMQ中的消費(fèi)模式和消費(fèi)策略詳解

    這篇文章主要介紹了RocketMQ中的消費(fèi)模式和消費(fèi)策略詳解,RocketMQ 是基于發(fā)布訂閱模型的消息中間件,所謂的發(fā)布訂閱就是說,consumer 訂閱了 broker 上的某個(gè) topic,當(dāng) producer 發(fā)布消息到 broker 上的該 topic 時(shí),consumer 就能收到該條消息,需要的朋友可以參考下
    2023-10-10
  • Java 選擇排序、插入排序、希爾算法實(shí)例詳解

    Java 選擇排序、插入排序、希爾算法實(shí)例詳解

    這篇文章主要介紹了Java 選擇排序、插入排序、希爾算法實(shí)例詳解,需要的朋友可以參考下
    2017-05-05
  • spring boot教程之全局處理異常封裝

    spring boot教程之全局處理異常封裝

    這篇文章主要給大家介紹了關(guān)于spring boot教程之全局處理異常封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java簡(jiǎn)易文本分割器實(shí)現(xiàn)代碼

    java簡(jiǎn)易文本分割器實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)易文本分割器的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 配置JAVA環(huán)境變量中CLASSPATH變量的作用

    配置JAVA環(huán)境變量中CLASSPATH變量的作用

    這篇文章主要介紹了配置JAVA環(huán)境變量中CLASSPATH變量的作用,需要的朋友可以參考下
    2023-06-06
  • Java中關(guān)于文件路徑讀取問題的分析

    Java中關(guān)于文件路徑讀取問題的分析

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java中關(guān)于文件路徑讀取問題展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

睢宁县| 苏尼特右旗| 库车县| 桑植县| 谢通门县| 鞍山市| 比如县| 瑞丽市| 平果县| 南溪县| 芦溪县| 乐清市| 彰武县| 金寨县| 察隅县| 南宁市| 邢台市| 镇平县| 桐乡市| 比如县| 衡水市| 淅川县| 濉溪县| 巧家县| 威宁| 德州市| 青海省| 宣恩县| 建水县| 凉城县| 三台县| 鄂伦春自治旗| 滨海县| 西盟| 甘南县| 中西区| 尤溪县| 嘉义县| 芷江| 汶上县| 唐河县|