日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

終于有人把Autowired注解講清楚了,贊!!!

來源: 責編: 時間:2024-04-02 17:21:37 245觀看
導讀@Autowired是什么@Autowired 注解由 Spring 的 org.springframework.beans.factory.annotation.Autowired 類定義, 直譯過來就是自動注入的意思。@Autowired的定義如下:@Target({ElementType.CONSTRUCTOR, ElementType

@Autowired是什么

@Autowired 注解由 Spring 的 org.springframework.beans.factory.annotation.Autowired 類定義, 直譯過來就是自動注入的意思。G6v28資訊網——每日最新資訊28at.com

@Autowired的定義如下:G6v28資訊網——每日最新資訊28at.com

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Autowired {    boolean required() default true;}

@Autowired 的使用場景

1.字段注入

將 @Autowired 直接應用于類的成員變量上。Spring 容器會自動為這些變量找到與其類型匹配的 Bean 實例,并進行注入。G6v28資訊網——每日最新資訊28at.com

public class MyClass {    @Autowired    private MyService myService;}

2.構造器注入

將 @Autowired 應用于類的構造函數上。G6v28資訊網——每日最新資訊28at.com

Spring 容器會自動解析構造函數的參數類型,并為這些參數找到與其類型匹配的 Bean 實例,然后注入到構造函數中。G6v28資訊網——每日最新資訊28at.com

public class MyClass {    private MyService myService;        @Autowired    public MyClass(MyService myService) {        this.myService = myService;    }}

3.方法注入

將 @Autowired 應用于類的方法上。G6v28資訊網——每日最新資訊28at.com

當類實例化時,Spring 容器會自動解析這些方法的參數類型,并為這些參數找到與其類型匹配的 Bean 實例,然后調用這些方法并注入參數。G6v28資訊網——每日最新資訊28at.com

public class MyClass {    private MyService myService;    @Autowired    public void setMyService(MyService myService) {        this.myService = myService;    }}

需要注意的是,通過 @Autowired 注解實現依賴注入時,如果在 Spring 容器中找不到與某個依賴類型匹配的 Bean 實例(或者找到多個,但沒有明確的優先級),那么 Spring 將拋出異常。G6v28資訊網——每日最新資訊28at.com

除非將該注解的 required 屬性設置為 false,這樣在找不到匹配的 Bean 時,框架將不會拋出異常。G6v28資訊網——每日最新資訊28at.com

public class MyClass {    @Autowired(required = false)    private MyService myService;}

@Autowired是如何工作的

在 Spring 中,AutowiredAnnotationBeanPostProcessor (AABP) 負責處理帶有 @Autowired 注解的成員變量、Setter 方法。G6v28資訊網——每日最新資訊28at.com

以下是 AABP 解析 @Autowired 的完整代碼調用流程:G6v28資訊網——每日最新資訊28at.com

當 Spring 容器實例化一個 Bean 時,會創建相應的 BeanDefinition 對象。BeanDefinition 包含了關于 Bean 的所有元數據信息。G6v28資訊網——每日最新資訊28at.com

在容器實例化、配置和初始化 Bean 的過程中,它會調用 AABP 的 postProcessMergedBeanDefinition 方法,以收集與依賴注入相關的元數據。G6v28資訊網——每日最新資訊28at.com

public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {  InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);  try {   metadata.inject(bean, beanName, pvs);  }  catch (BeanCreationException ex) {   throw ex;  }  catch (Throwable ex) {   throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);  }  return pvs; }

findAutowiringMetadata 方法會查找 Bean 的所有@Autowired 注解相關的元數據,并獲取 InjectionMetadata 對象, 如果該對象尚不存在,會創建一個新的對象。G6v28資訊網——每日最新資訊28at.com

protected InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) {    // ... (省略無關代碼)    List<InjectionMetadata.InjectedElement> elements = new ArrayList<>();    Class<?> targetClass = clazz;    // 遍歷 Bean 的類結構,從子類向基類查找有@Autowired 注解的字段、方法和構造器    do {        final List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>();        ReflectionUtils.doWithLocalFields(targetClass, field -> {            // 尋找帶有@Autowired 注解的字段            MergedAnnotation<?> ann = findAutowiredAnnotation(field);            if (ann != null) {                if (Modifier.isStatic(field.getModifiers())) {                    // 靜態字段不能自動注入                    // ... (省略錯誤處理和日志)                }                boolean required = determineRequiredStatus(ann);                // AutowiredFieldElement 屬性Autowired元素                currElements.add(new AutowiredFieldElement(field, required));            }        });        ReflectionUtils.doWithLocalMethods(targetClass, method -> {            // 尋找帶有@Autowired 注解的Setter方法或普通方法            Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);            if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {                return;            }            MergedAnnotation<?> ann = findAutowiredAnnotation(bridgedMethod);            if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {                if (Modifier.isStatic(method.getModifiers())) {                    // 靜態方法不能自動注入                    // ... (省略錯誤處理和日志)                }                PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);                boolean required = determineRequiredStatus(ann);                // AutowiredMethodElement 方法 Autowired 元素                currElements.add(new AutowiredMethodElement(method, required, pd));            }        });        elements.addAll(0, currElements);        targetClass = targetClass.getSuperclass();    }    while (targetClass != null && targetClass != Object.class);    // 構建并返回 InjectionMetadata 對象    return new InjectionMetadata(clazz, elements);}

上面的代碼中,我在關鍵位置添加了注釋,老鐵們可以仔細看一下,上述代碼的主要作用就是找到一個類中:G6v28資訊網——每日最新資訊28at.com

  • 添加了@Autowired的屬性信息,用 AutowiredFieldElement進行表示。
  • 添加了 @Autowired 的方法信息,用AutowiredMethodElement進行表示。

當依賴注入需要發生時,容器會調用 AABP 的 postProcessProperties 方法。G6v28資訊網——每日最新資訊28at.com

該方法中會調用 InjectionMetadata 的 inject 方法來實際注入 @Autowired 注解的成員變量、成員方法:G6v28資訊網——每日最新資訊28at.com

metadata.inject(bean, beanName, pvs);

最后,通過執行 AutowiredFieldElement 和 AutowiredMethodElement 的 inject 方法來實際注入屬性值和方法參數。G6v28資訊網——每日最新資訊28at.com

AutowiredFieldElement 的 inject 方法實現如下:G6v28資訊網——每日最新資訊28at.com

@Override  protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {   Field field = (Field) this.member;   Object value;   if (this.cached) {    try {     value = resolvedCachedArgument(beanName, this.cachedFieldValue);    }    catch (NoSuchBeanDefinitionException ex) {     // Unexpected removal of target bean for cached argument -> re-resolve     value = resolveFieldValue(field, bean, beanName);    }   }   else {    value = resolveFieldValue(field, bean, beanName);   }   if (value != null) {    ReflectionUtils.makeAccessible(field);    field.set(bean, value);   }  }

AutowiredMethodElement 的 inject 方法的實現如下:G6v28資訊網——每日最新資訊28at.com

@Override  protected void inject(Object bean, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {   if (checkPropertySkipping(pvs)) {    return;   }   Method method = (Method) this.member;   Object[] arguments;   if (this.cached) {    try {     arguments = resolveCachedArguments(beanName);    }    catch (NoSuchBeanDefinitionException ex) {     // Unexpected removal of target bean for cached argument -> re-resolve     arguments = resolveMethodArguments(method, bean, beanName);    }   }   else {    arguments = resolveMethodArguments(method, bean, beanName);   }   if (arguments != null) {    try {     ReflectionUtils.makeAccessible(method);     method.invoke(bean, arguments);    }    catch (InvocationTargetException ex) {     throw ex.getTargetException();    }   }  }

通過以上流程,AutowiredAnnotationBeanPostProcessor 將解析并注入帶有 @Autowired 注解的成員變量、方法。G6v28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-80864-0.html終于有人把Autowired注解講清楚了,贊!!!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 超火前端框架:公開叫板 Vue、React,擁有 5k star

下一篇: 可伸縮架構案例:數據太多,如何無限擴展你的數據庫?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美综合二区| 亚洲国产人成综合网站| 欧美精品激情| 欧美日韩在线视频首页| 国产精品久久久久一区二区三区共| 国产精品日韩专区| 国产一区91精品张津瑜| 亚洲福利视频网站| 一区二区三区欧美亚洲| 亚洲午夜三级在线| 欧美中文字幕在线视频| 免费成人在线视频网站| 欧美高清视频| 国产精品视频yy9299一区| 韩国精品久久久999| 亚洲国产日韩欧美在线动漫| 一区二区三区欧美亚洲| 久久激五月天综合精品| 欧美黑人在线播放| 国产精品免费福利| 影音先锋亚洲电影| 亚洲社区在线观看| 亚洲区在线播放| 亚洲一区欧美| 裸体丰满少妇做受久久99精品| 欧美日韩国产在线播放| 国产一区二区久久久| 亚洲精品在线视频观看| 亚洲欧美日韩在线高清直播| 欧美不卡视频一区| 国产精品网站一区| 亚洲黄一区二区三区| 亚洲欧美日本另类| 欧美91视频| 国产欧美日韩在线视频| 亚洲国产精选| 性欧美超级视频| 先锋资源久久| 欧美精品国产精品| 国产一区二区在线观看免费| 99视频精品全国免费| 久久国产精品亚洲va麻豆| 欧美欧美天天天天操| 国产综合在线视频| 亚洲色图制服丝袜| 另类av一区二区| 国产日产精品一区二区三区四区的观看方式 | 国产日韩欧美精品一区| 99综合视频| 亚洲视频在线观看三级| 免费短视频成人日韩| 国产精品日韩欧美一区二区三区| 亚洲精品视频二区| 久久久精品国产99久久精品芒果| 欧美日韩国产综合视频在线观看 | 一区二区三区四区五区精品| 久久综合色一综合色88| 国产欧美日韩一区| 亚洲无亚洲人成网站77777 | 国产精品九九| 日韩网站在线| 欧美成人中文字幕在线| 国内自拍亚洲| 先锋影音久久| 国产精品国产三级国产aⅴ入口 | 欧美成人一区二区三区在线观看| 好看的日韩视频| 欧美一二三视频| 国产精品日日摸夜夜摸av| 99热免费精品| 欧美日韩国产影片| 亚洲欧洲一区二区在线观看| 久久综合色婷婷| 黄色小说综合网站| 久久九九国产精品怡红院| 国产精品亚洲综合| 亚洲欧美日韩一区在线| 国产精品乱码| 亚洲欧美日韩天堂| 国产精品一二一区| 午夜在线成人av| 国产欧美日韩免费看aⅴ视频| 亚洲一区二区三区国产| 国产精品久久久久高潮| 亚洲在线观看视频| 国产精品入口日韩视频大尺度| 一本色道久久综合亚洲二区三区| 欧美日韩国产系列| 亚洲午夜小视频| 国产精品日韩在线| 午夜精品一区二区在线观看| 国产精品入口麻豆原神| 欧美在线免费观看视频| 国产一二精品视频| 久久久久免费视频| 亚洲福利一区| 欧美国产亚洲精品久久久8v| 亚洲日本欧美天堂| 欧美日韩精品免费| 亚洲视频一区在线| 国产精品亚洲综合一区在线观看| 亚洲综合好骚| 国产精品视频自拍| 欧美一级二区| 精品福利免费观看| 欧美激情第五页| 亚洲一区二区免费| 国产亚洲成精品久久| 久久亚洲美女| 亚洲免费福利视频| 国产精品久久亚洲7777| 欧美一区二区视频在线| 一区二区三区在线观看欧美 | 国产精品看片你懂得| 欧美一区二区三区在线| 韩日在线一区| 欧美国产日韩精品免费观看| 夜夜嗨av一区二区三区网页| 国产精品视频一二| 久久久精品欧美丰满| 亚洲国产女人aaa毛片在线| 欧美日韩国产精品自在自线| 亚洲免费伊人电影在线观看av| 国产精品在线看| 美女诱惑黄网站一区| 夜夜嗨av一区二区三区中文字幕 | 亚洲乱码国产乱码精品精 | 夜夜嗨av一区二区三区| 国产亚洲精品资源在线26u| 免费成人网www| 亚洲午夜国产成人av电影男同| 国产日韩欧美综合在线| 男人的天堂亚洲在线| 亚洲一区二区精品| 悠悠资源网久久精品| 欧美视频日韩视频| 久久久久欧美精品| 一区二区三区日韩在线观看| 国内精品视频在线播放| 欧美女同视频| 久久久精品999| 一区二区三区日韩精品视频| 黑丝一区二区| 国产精品成人aaaaa网站| 久久久久女教师免费一区| 中日韩美女免费视频网址在线观看 | 亚洲性av在线| 在线日韩成人| 国产精品欧美日韩| 欧美大片免费观看| 欧美一级淫片播放口| 亚洲精品久久视频| 国产一区二区三区在线观看网站| 欧美日韩国产色综合一二三四| 久久精品毛片| 亚洲午夜在线视频| 亚洲国产精品传媒在线观看| 国产精品一区视频网站| 欧美精品激情在线| 久久亚洲图片| 欧美亚洲在线| 一区二区三区视频在线看| 在线免费观看日本欧美| 国产精品国产三级国产专区53| 免费在线日韩av| 久久国产视频网| 亚洲影院在线| 日韩午夜在线播放| 亚洲第一二三四五区| 国产日韩精品在线观看| 欧美性片在线观看| 欧美激情网友自拍| 久久亚洲综合色| 欧美在线视频二区| 亚洲一区二区三区四区中文 | 欧美三级韩国三级日本三斤| 女同性一区二区三区人了人一| 久久国产精品久久久久久| 亚洲欧美久久久| 中日韩午夜理伦电影免费| 亚洲精品一二三区| 亚洲激精日韩激精欧美精品| 一区在线视频| 国内精品一区二区三区| 国产日韩精品久久| 国产精品网红福利| 国产精品日产欧美久久久久| 欧美视频在线免费看| 欧美日韩精品一区二区| 欧美经典一区二区| 欧美成人一区二区三区在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 欧美中文字幕在线观看| 午夜在线播放视频欧美| 亚洲欧美日韩成人| 亚洲一区二区在线播放| 亚洲视频一区| 亚洲一区二区三区高清 | 欧美久久在线| 欧美区一区二| 欧美欧美在线| 欧美日韩在线播放| 欧美亚男人的天堂| 国产精品久久久久久久免费软件 |