精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

揭秘 @Autowired 自動(dòng)裝配原理與實(shí)現(xiàn)機(jī)制

開(kāi)發(fā) 前端
在Java開(kāi)發(fā)中,Spring框架憑借強(qiáng)大的依賴(lài)注入(Dependency Injection,DI)功能極大地提升了代碼的可維護(hù)性和可擴(kuò)展性。其中,@Autowired注解作為Spring實(shí)現(xiàn)依賴(lài)注入的核心手段之一,被開(kāi)發(fā)者廣泛使用。

前言

在Java開(kāi)發(fā)中,Spring框架憑借強(qiáng)大的依賴(lài)注入(Dependency Injection,DI)功能極大地提升了代碼的可維護(hù)性和可擴(kuò)展性。其中,@Autowired注解作為Spring實(shí)現(xiàn)依賴(lài)注入的核心手段之一,被開(kāi)發(fā)者廣泛使用。

但@Autowired究竟是如何實(shí)現(xiàn)自動(dòng)裝配的呢?本文將深入剖析其原理與實(shí)現(xiàn)機(jī)制,揭開(kāi)它的神秘面紗。

自動(dòng)裝配的核心流程

啟動(dòng)容器時(shí)的掃描與解析

當(dāng)Spring容器啟動(dòng)時(shí),會(huì)根據(jù)配置(如XML 配置或注解配置)掃描指定包路徑下的類(lèi)。對(duì)于被@Component、@Service、@Repository、@Controller等注解標(biāo)注的類(lèi),Spring會(huì)將其注冊(cè)為Bean,并存儲(chǔ)在容器的BeanDefinition注冊(cè)表中。在這個(gè)過(guò)程中,如果遇到帶有@Autowired注解的字段、方法或構(gòu)造函數(shù),會(huì)記錄下依賴(lài)關(guān)系信息。

實(shí)例化與依賴(lài)注入

在創(chuàng)建Bean實(shí)例時(shí),Spring會(huì)根據(jù)BeanDefinition中的信息,首先實(shí)例化Bean(對(duì)于單例Bean,只會(huì)實(shí)例化一次)。在實(shí)例化完成后,Spring會(huì)處理@Autowired注解。對(duì)于字段上的@Autowired,Spring會(huì)在容器中查找與字段類(lèi)型匹配的Bean。查找過(guò)程中,會(huì)優(yōu)先按照類(lèi)型匹配,如果存在多個(gè)同類(lèi)型的Bean,則會(huì)根據(jù)字段名或使用@Qualifier注解指定的名稱(chēng)進(jìn)一步篩選。找到匹配的Bean后,將其注入到對(duì)應(yīng)字段。

循環(huán)依賴(lài)處理

圖片圖片

在自動(dòng)裝配過(guò)程中,可能會(huì)遇到循環(huán)依賴(lài)的情況,即兩個(gè)或多個(gè)Bean之間相互依賴(lài)。Spring容器通過(guò)三級(jí)緩存機(jī)制來(lái)處理循環(huán)依賴(lài)問(wèn)題。一級(jí)緩存存儲(chǔ)完全初始化好的Bean;二級(jí)緩存存儲(chǔ)早期暴露的Bean(尚未完成屬性填充和初始化);三級(jí)緩存存儲(chǔ)Bean 的創(chuàng)建工廠。當(dāng)檢測(cè)到循環(huán)依賴(lài)時(shí),Spring會(huì)從二級(jí)緩存中獲取早期暴露的Bean,避免因循環(huán)依賴(lài)導(dǎo)致的死循環(huán)問(wèn)題。

Bean的初始化過(guò)程

Spring的可以分為5個(gè)小的階段:實(shí)例化、初始化、注冊(cè)Destruction回調(diào)、Bean的正常使用以及Bean的銷(xiāo)毀。

圖片圖片

  • 實(shí)例化(Instantiation):
  • 實(shí)例化是創(chuàng)建對(duì)象的過(guò)程。在Spring中,這通常指的是通過(guò)調(diào)用類(lèi)的構(gòu)造器來(lái)創(chuàng)建Bean的實(shí)例。這是對(duì)象生命周期的開(kāi)始階段。對(duì)應(yīng)doCreateBean中的createBeanInstance方法。
  • 初始化(Initialization):
  • 初始化是在Bean實(shí)例創(chuàng)建后,進(jìn)行一些設(shè)置或準(zhǔn)備工作的過(guò)程。在Spring中,包括設(shè)置Bean的屬性,調(diào)用各種前置&后置處理器。對(duì)應(yīng)doCreateBean中的populateBean和initializeBean方法。

自動(dòng)裝配其實(shí)發(fā)生在Instantiation -> Populate -> Initialization的過(guò)程中,屬于Bean的生命周期中的populate階段。

  • 在實(shí)例化Bean的時(shí)候在createBeanInstance方法中會(huì)調(diào)用 AutowiredAnnotationBeanPostProcessor中的方法來(lái)獲取需要自動(dòng)注入的構(gòu)造方法,AutowiredAnnotationBeanPostProcessor的方法來(lái)完成對(duì)所有需要自動(dòng)注入的屬性和方法的解析和緩存。
  • populatedBean方法中調(diào)用到AutowiredAnnotationBeanPostProcessor中的方法來(lái)完成需要自動(dòng)注入屬性的注入工作。
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
    // 獲取Bean定義中的屬性值    
    PropertyValues pvs = mbd.getPropertyValues();
    // 如果BeanWrapper為空,則無(wú)法設(shè)置屬性值    
    if (bw == null) {
        if (!pvs.isEmpty()) {
            throw new BeanCreationException(
                    mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
        } else {
            // 對(duì)于null實(shí)例,跳過(guò)設(shè)置屬性階段            
            return;
        }
    }
    // 在設(shè)置屬性之前,給InstantiationAwareBeanPostProcessors機(jī)會(huì)修改Bean狀態(tài)    
    // 這可以用于支持字段注入等樣式    
    boolean continueWithPropertyPopulation = true;
    // 如果Bean不是合成的,并且存在InstantiationAwareBeanPostProcessor,執(zhí)行后續(xù)處理    
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                    continueWithPropertyPopulation = false;
                    break;
                }
            }
        }
    }
    // 如果上述處理后決定不繼續(xù),則返回    
    if (!continueWithPropertyPopulation) {
        return;
    }
    // 根據(jù)自動(dòng)裝配模式(按名稱(chēng)或類(lèi)型),設(shè)置相關(guān)的屬性值    
    if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
            mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
        MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        // 如果是按名稱(chēng)自動(dòng)裝配,添加相應(yīng)的屬性值        
        if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
            autowireByName(beanName, mbd, bw, newPvs);
        }
        // 如果是按類(lèi)型自動(dòng)裝配,添加相應(yīng)的屬性值        
        if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
            autowireByType(beanName, mbd, bw, newPvs);
        }
        pvs = newPvs;
    }
    // 檢查是否需要進(jìn)行依賴(lài)性檢查    
    boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);
    // 如果需要,則進(jìn)行依賴(lài)性檢查    
    if (hasInstAwareBpps || needsDepCheck) {
        PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
        if (hasInstAwareBpps) {
            for (BeanPostProcessor bp : getBeanPostProcessors()) {
                if (bp instanceof InstantiationAwareBeanPostProcessor) {
                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                    pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                    if (pvs == null) {
                        return;
                    }
                }
            }
        }
        if (needsDepCheck) {
            checkDependencies(beanName, mbd, filteredPds, pvs);
        }
    }
    // 應(yīng)用屬性值    
    applyPropertyValues(beanName, mbd, bw, pvs);
}

@Autowired 實(shí)現(xiàn)的關(guān)鍵源碼解析

@Autowired注解的實(shí)現(xiàn)主要涉及到AutowiredAnnotationBeanPostProcessor類(lèi),它繼承自InstantiationAwareBeanPostProcessorAdapter(后期被棄用,改實(shí)現(xiàn)SmartInstantiationAwareBeanPostProcessor),該類(lèi)實(shí)現(xiàn)了postProcessProperties方法,用于處理Bean的屬性注入。

@Override
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;
}

在postProcessProperties方法中,首先通過(guò)findAutowiringMetadata方法獲取與@Autowired相關(guān)的元數(shù)據(jù)(包括要注入的字段、方法等信息),然后調(diào)用metadata.inject方法進(jìn)行實(shí)際的依賴(lài)注入操作。metadata.inject方法會(huì)遍歷需要注入的元素,通過(guò)反射機(jī)制獲取對(duì)應(yīng)的Bean并完成注入。

總結(jié)

如果你在面試中遇到這個(gè)問(wèn)題,可以這樣回答:

  1. @Autowired是Spring提供的自動(dòng)裝配注解,它通過(guò)AutowiredAnnotationBeanPostProcessor實(shí)現(xiàn)依賴(lài)注入。
  2. 這個(gè)處理器在Bean初始化階段介入,掃描字段或方法的注解,找到需要注入的地方,然后根據(jù)類(lèi)型從容器中查找Bean,通過(guò)反射完成注入。
  3. 如果存在多個(gè)實(shí)現(xiàn),可以通過(guò)@Qualifier或@Primary來(lái)指定注入對(duì)象。構(gòu)造器注入則在實(shí)例化時(shí)完成,推薦用于強(qiáng)依賴(lài)場(chǎng)景。
責(zé)任編輯:武曉燕 來(lái)源: 一安未來(lái)
相關(guān)推薦

2025-01-14 10:09:43

硬中斷Linux系統(tǒng)

2022-08-08 07:33:11

自動(dòng)裝配Java容器

2024-12-25 16:01:01

2012-11-28 10:37:25

Linux集群安裝配置

2020-09-22 08:52:50

平臺(tái)實(shí)現(xiàn)消息

2011-06-13 10:21:25

QT 信號(hào) 槽機(jī)制

2025-05-27 01:00:00

2010-04-29 10:11:07

Linux集群

2024-10-10 17:46:06

2021-07-19 09:25:19

數(shù)據(jù)庫(kù)MySQL技術(shù)

2022-04-08 08:32:40

mobx狀態(tài)管理庫(kù)redux

2024-10-10 12:12:45

SpringAI版本

2012-02-17 10:50:10

Java

2010-08-06 09:45:50

Flex事件機(jī)制

2010-08-06 10:15:35

Flex綁定

2009-09-04 10:37:50

Java堆棧溢出

2020-02-25 16:48:35

AndroidGoogle 移動(dòng)系統(tǒng)

2021-05-13 23:30:17

JavaScript 原理揭秘

2015-03-27 09:50:37

2021-12-20 00:03:38

Webpack運(yùn)行機(jī)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲成aⅴ人片久久青草影院| 色一情一乱一乱一区91av| 欧亚精品一区| 色婷婷久久99综合精品jk白丝| 视频一区二区在线| 国产高潮在线观看| 国产亚洲激情| 日韩中文在线不卡| 在线观看成人动漫| 992tv国产精品成人影院| 亚洲人成亚洲人成在线观看图片| 国产伦精品一区二区三区| 免费精品一区二区| 国产一区二区三区自拍| 精品亚洲男同gayvideo网站| 国产精品自拍视频在线| 国产白浆在线免费观看| 中文字幕免费一区| 国产亚洲一区在线播放| 一级片一区二区三区| 一本久道综合久久精品| 久久精品视频va| 久久久精品人妻无码专区| 亚洲视频自拍| 色悠久久久久综合欧美99| 在线观看污视频| 黄色片在线免费看| 成人av网址在线观看| 国产一区二区视频在线观看| 看片网址国产福利av中文字幕| 国产区精品区| 亚洲精品短视频| 丰满少妇一区二区三区专区| 福利视频亚洲| 色噜噜久久综合| 人妻少妇精品久久| 中文字幕有码在线观看| 国产拍欧美日韩视频二区 | 丝袜美腿一区| 一区二区三区不卡视频| 一本二本三本亚洲码| 国产精品无码2021在线观看| aaa亚洲精品| 成人91视频| 国产普通话bbwbbwbbw| 男人的天堂久久精品| 国产99久久精品一区二区永久免费| 久久久久久久久久99| 自由日本语亚洲人高潮| 日韩视频在线免费| 亚洲色图27p| 日韩欧美网址| 在线视频国产日韩| 嘿嘿视频在线观看| 欧美日韩水蜜桃| 亚洲天天在线日亚洲洲精| 国产伦精品一区二区三区妓女| 大型av综合网站| 精品国产1区二区| 中文字幕第3页| 欧美jizz19性欧美| 日韩精品在线观看一区二区| 韩国无码一区二区三区精品| 精品中国亚洲| 日韩精品中文字| 免费看污黄网站在线观看| 亚洲小说图片| 中文字幕国产日韩| 中文字幕在线观看2018| 午夜精品免费| 97精品一区二区三区| av大片免费观看| 日韩精品三区四区| 国产专区精品视频| www精品国产| www.爱久久.com| 美国av一区二区三区| 成人影视在线播放| **欧美大码日韩| 欧美人与动牲交xxxxbbbb| 国产三线在线| 色婷婷综合久久| 玖玖爱视频在线| 一区二区三区国产好| 日韩h在线观看| 调教驯服丰满美艳麻麻在线视频| 99久久99久久精品国产片桃花 | 激情五月激情综合| 综合精品久久| 欧美孕妇与黑人孕交| 亚洲天堂2021av| 成人手机电影网| 日韩中文字幕一区二区| 国产在线1区| 精品国产31久久久久久| 一路向西2在线观看| 日韩精品一区二区三区中文| 亚洲精品视频免费在线观看| av在线免费播放网址| 99精品热6080yy久久| 国产日韩欧美一二三区| 天天爽夜夜爽夜夜爽| 欧美极品另类videosde| 欧美视频在线观看视频| 亚洲爱爱视频| 日韩午夜中文字幕| 一区二区三区伦理片| 欧美女人交a| 国产精品久久电影观看| 国产18精品乱码免费看| 国产精品国产自产拍高清av| 日韩精品在线观看av| 国产精品美女午夜爽爽| 亚洲精品久久久久久久久久久 | 亚洲图片欧美色图| 在线观看免费污视频| 婷婷成人综合| 九九精品在线播放| 中文字幕一区二区三区四区免费看| 成人免费福利片| 成年人黄色在线观看| 日韩电影免费观| 亚洲精品一区二区三区四区高清| 污污视频网站在线免费观看| 最新日韩在线| 91嫩草在线| 国产黄色小视频在线| 在线观看免费一区| 欧美深性狂猛ⅹxxx深喉| 欧美/亚洲一区| 国产人妖伪娘一区91| 青青草在线免费视频| 亚洲一区在线观看网站| gai在线观看免费高清| 欧美精品系列| 人人爽久久涩噜噜噜网站| 韩国av电影在线观看| 亚洲卡通欧美制服中文| 老司机久久精品| 精品国产一区探花在线观看| 欧美在线视频一二三| 欧美一区,二区| 亚洲第一综合色| 国产免费无码一区二区| 在线成人超碰| 91亚洲精品久久久| 成年人黄视频在线观看| 欧美美女一区二区在线观看| 四虎影视1304t| 美女视频黄久久| 亚洲欧美在线网| 欧美日韩视频免费看| 日韩中文字幕免费视频| 一区二区三区免费在线| 国产精品日韩精品欧美在线| 日本特黄a级片| 日韩欧美视频| 91系列在线观看| 色呦呦呦在线观看| 精品国产免费久久 | 色久综合一二码| 中文字幕人妻一区二区三区在线视频| 久久久777| 色综合久久av| 亚洲精品自拍| 欧美国产第一页| 色呦呦视频在线| 色一区在线观看| 亚洲а∨天堂久久精品2021| 毛片不卡一区二区| 久久99国产精品一区| 日韩高清一区| 97国产精品免费视频| 免费国产在线视频| 欧美日韩国产高清一区二区三区| 多男操一女视频| 国产盗摄视频一区二区三区| 久久国产精品视频在线观看| 一区三区在线欧| 国产精品一二三在线| 97超碰在线公开在线看免费| 欧美精品一区二区久久久| 精品在线播放视频| 中文字幕免费观看一区| 亚洲av午夜精品一区二区三区| 国产亚洲欧洲| 亚洲精品一区国产精品| 综合欧美亚洲| 国产精品96久久久久久| 国产高清一区二区三区视频| 亚洲精品v天堂中文字幕| 伊人网中文字幕| 亚洲综合久久久| 谁有免费的黄色网址| 国产激情91久久精品导航| 2022亚洲天堂| 亚洲精品97| 免费久久99精品国产自| 国产精品高清一区二区| 欧美亚洲激情在线| a级片国产精品自在拍在线播放| 亚洲精品美女免费| 99国产揄拍国产精品| 色婷婷国产精品久久包臀| 国产精品白丝喷水在线观看| 久久综合色8888| 欧美视频亚洲图片| 久久精品中文| 久久成人福利视频| 99视频精品全国免费| 久久大片网站| 亚洲精品一区二区三区在线| 国产女人18毛片水18精品| 亚洲天堂电影| 久久久久久香蕉网| 国产精品剧情| 在线播放日韩欧美| 婷婷五月综合激情| 欧美一级二级三级乱码| 一级成人免费视频| 91电影在线观看| 国产尤物在线视频| 亚洲综合在线免费观看| 国产精品久久国产精麻豆96堂| 99国产精品久久久久久久久久| 日本r级电影在线观看| 青青草精品视频| 久久美女福利视频| 亚洲国产国产亚洲一二三| 中文字幕成人一区| 成人激情在线| 日韩国产高清一区| 国产伦一区二区三区| 国产亚洲自拍偷拍| 国偷自产av一区二区三区| 91网站在线看| 高清在线一区二区| 91人成网站www| 欧美成人xxxx| 国产精品网红直播| 91亚洲精品| 国产精品久久久久久久久免费看| 不卡一二三区| 欧美在线一级va免费观看| 免费h视频在线观看| 午夜精品理论片| av资源新版天堂在线| 久久中国妇女中文字幕| 黄在线免费观看| 久久影院免费观看| 成人在线播放免费观看| 久久躁狠狠躁夜夜爽| 黄色成人在线| 欧美精品生活片| av网站大全在线| 久久综合伊人77777尤物| 黄色网在线免费观看| 久久精品亚洲国产| 最爽无遮挡行房视频在线| 久久av在线看| 在线三级中文| 国产69精品久久久久9999| 日韩伦理福利| 日本久久久久久久久| 成人在线免费电影网站| 国产精品中文在线| 欧美成人精品午夜一区二区| 高清不卡一区二区三区| 国产精品高潮呻吟久久久久| 久久综合久久综合这里只有精品| 伊人久久大香线蕉综合网站| 日韩成人av网站| 欧美第一精品| 欧美一区二区视频在线播放| 中文亚洲免费| 999精品视频在线| 国产精品中文有码| 中文字幕免费在线播放| 久久久精品黄色| 91视频青青草| 亚洲va欧美va国产va天堂影院| 久久夜色精品国产噜噜亚洲av| 在线免费观看不卡av| 国产精品-色哟哟| 亚洲成成品网站| 国产youjizz在线| 欧美xxxx做受欧美| 色是在线视频| 成人夜晚看av| 亚欧洲精品视频在线观看| 亚洲国产欧美一区二区三区不卡| 亚洲va在线| 免费无遮挡无码永久视频| 青青草国产精品97视觉盛宴| 无码人妻少妇色欲av一区二区| 91免费看视频| 国产黄a三级三级| 亚洲.国产.中文慕字在线| 国产精品第6页| 日韩欧美色电影| 国产在线一二三区| 欧美日韩成人在线观看| 日本精品网站| 国产精品一区二区欧美| 久久麻豆精品| 欧美 国产 日本| 国产iv一区二区三区| 蜜桃久久精品成人无码av| 亚洲国产中文字幕在线视频综合| 高潮无码精品色欲av午夜福利| 精品日韩一区二区三区免费视频| 亚洲成人三级| 日本道色综合久久影院| 亚洲一区网址| 亚洲色图自拍| 嫩草成人www欧美| 日本精品一二三区| 亚洲女子a中天字幕| 波多野结衣电影在线播放| 亚洲第一福利网站| 羞羞的网站在线观看| 国产日韩欧美在线| 精品色999| 免费av网址在线| 99国产精品99久久久久久| 欧美成人精品一区二区免费看片| 欧美三级电影精品| 精品视频一二三| 欧美一级大胆视频| 另类春色校园亚洲| av在线播放天堂| 粉嫩高潮美女一区二区三区 | 精产国品一二三区| 国产精品成人免费| 免费在线观看av的网站| 亚洲欧美日韩图片| 手机在线观看av| 国产一区高清视频| 91久久综合| 国产激情视频网站| 香蕉成人啪国产精品视频综合网 | 青青草原成人| 欧美专区一区二区三区| 性欧美精品男男| 国产做a爰片久久毛片| 亚洲AV无码片久久精品| 五月激情综合网| 日韩一卡二卡在线| 97精品一区二区三区| av在线亚洲色图| 精品一二三四五区| 东方欧美亚洲色图在线| 久草免费新视频| 欧美成人欧美edvon| 青草在线视频| 国产99在线免费| 国产日韩欧美一区在线| 中文字幕av观看| 一本到不卡免费一区二区| 国产香蕉在线| 国产日韩欧美91| 自拍偷拍欧美专区| 国产国语老龄妇女a片| 五月激情六月综合| 黄色软件在线观看| 国产美女久久精品香蕉69| 图片区亚洲欧美小说区| 男插女视频网站| 亚洲一区电影777| 欧美成人网在线| 国产无套粉嫩白浆内谢| 日韩一级片在线播放| 欧美日韩经典丝袜| 国产伦精品一区二区三区视频黑人 | 激情五月亚洲色图| 四虎成人精品永久免费av九九| 日韩精品一区二区三区swag| 免费高清完整在线观看| 亚洲一区二区在线播放| 精品动漫av| www.久久av| 欧美精品少妇一区二区三区| 污的网站在线观看| 另类小说综合网| 老司机午夜精品| 精品少妇一二三区| 亚洲欧美在线免费| 国产视频网站一区二区三区| 3d动漫一区二区三区| 国产蜜臀97一区二区三区| 国产视频手机在线观看| 欧美亚洲国产视频小说| 99久久夜色精品国产亚洲狼| 亚洲啪av永久无码精品放毛片| 色婷婷久久综合| 日本一级理论片在线大全| 欧美亚洲另类久久综合| 国产精品12区| 91视频久久久| 国模gogo一区二区大胆私拍|