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

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

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

一、Autowired注解的用法

1、概述

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

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

2、應用

應用與構造方法注入

應用與setter方法注入

應用與屬性注入

3、具體用法

@Autowired

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

位置:修飾屬性,set方法

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

注意:

1.如果容器中沒有一個可以與之匹配且required屬性為true則會報異常NoSuchBeanDefinitionException

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

3.如果容器中有多個可以類型可以與之匹配,則自動切換為按照名稱裝配,如果名稱也沒有匹配,則報異常NoUniqueBeanDefinitionException

二、Autowired自動裝配的過程

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

1、在Spring源代碼當中,Autowired注解位于包org.springframework.beans.factory.annotation之中,該包的內容如下:

核心代碼如下

private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) {
  LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<>();
  Class<?> targetClass = clazz;//需要處理的目標類
       
  do {
   final LinkedList<InjectionMetadata.InjectedElement> currElements = new LinkedList<>();
 
            /*通過反射獲取該類所有的字段,并遍歷每一個字段,并通過方法findAutowiredAnnotation遍歷每一個字段的所用注解,并如果用autowired修飾了,則返回auotowired相關屬性*/  
 
   ReflectionUtils.doWithLocalFields(targetClass, field -> {
    AnnotationAttributes ann = findAutowiredAnnotation(field);
    if (ann != null) {//校驗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修飾的注解可能不止一個,因此都加在currElements這個容器里面,一起處理  
   elements.addAll(0, currElements);
   targetClass = targetClass.getSuperclass();
  }
  while (targetClass != null && targetClass != Object.class);
 
  return new InjectionMetadata(clazz, elements);
 }

總結:

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

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

相關文章

  • 解決IDEA中不能正常輸入光標變粗的問題

    解決IDEA中不能正常輸入光標變粗的問題

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

    Java全面細致講解類與對象

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

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

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

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

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

    RocketMQ中的消費模式和消費策略詳解

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

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

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

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

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

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

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

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

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

    Java中關于文件路徑讀取問題的分析

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

最新評論

莲花县| 临城县| 漯河市| 开封县| 镇赉县| 濉溪县| 鄂托克旗| 敦煌市| 西乌珠穆沁旗| 永康市| 扎鲁特旗| 丰宁| 任丘市| 额尔古纳市| 中宁县| 盐山县| 博野县| 观塘区| 扶风县| 湘潭县| 昌黎县| 芜湖市| 柘荣县| 元谋县| 芜湖县| 吉林省| 黑龙江省| 佛冈县| 乌恰县| 沙湾县| 嘉禾县| 莒南县| 灵川县| 蓝山县| 丹东市| 侯马市| 临漳县| 饶河县| 庆元县| 灵山县| 扬州市|