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

Spring?Boot如何處理@Resource示例分析

 更新時(shí)間:2023年07月06日 11:34:24   作者:子瞻  
這篇文章主要為大家介紹了Spring?Boot如何處理@Resource示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

先造一個(gè)測(cè)試用例

public class TransactionServiceTest {
    @Resource
    private IQrcodeAdScheduleService qrcodeAdScheduleService;
}

啟動(dòng)Spring Boot調(diào)用棧信息

圖1

解析@Resource對(duì)應(yīng)的bean信息

由上圖可知,在創(chuàng)建完bean實(shí)例后,通過(guò)applyMergedBeanDefinitionPostProcessors()修改beanDefinition結(jié)構(gòu)(針對(duì)這種場(chǎng)景可以理解為解析@Resource對(duì)應(yīng)的bean信息)

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof MergedBeanDefinitionPostProcessor) {
                MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
                //執(zhí)行CommonAnnotationBeanPostProcessor類(lèi)postProcessMergedBeanDefinition()
                bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
            }
        }
    }

圖2

CommonAnnotationBeanPostProcessor

有圖2可知,處理@Resource的PostProcessor是“CommonAnnotationBeanPostProcessor”,然后看一下CommonAnnotationBeanPostProcessor的部分細(xì)節(jié):

private InjectionMetadata buildResourceMetadata(final Class<?> clazz) {
        LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<>();
        Class<?> targetClass = clazz;
        do {
            final LinkedList<InjectionMetadata.InjectedElement> currElements =
                    new LinkedList<>();
            ReflectionUtils.doWithLocalFields(targetClass, field -> {
                if (webServiceRefClass != null && field.isAnnotationPresent(webServiceRefClass)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@WebServiceRef annotation is not supported on static fields");
                    }
                    currElements.add(new WebServiceRefElement(field, field, null));
                }
                else if (ejbRefClass != null && field.isAnnotationPresent(ejbRefClass)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@EJB annotation is not supported on static fields");
                    }
                    currElements.add(new EjbRefElement(field, field, null));
                }
                //解析@Resource.class
                else if (field.isAnnotationPresent(Resource.class)) {
                    if (Modifier.isStatic(field.getModifiers())) {
                        throw new IllegalStateException("@Resource annotation is not supported on static fields");
                    }
                    if (!ignoredResourceTypes.contains(field.getType().getName())) {
                        currElements.add(new ResourceElement(field, field, null));
                    }
                }
            });
}

上面的代碼塊出現(xiàn)了期待已久的“Resource.class”關(guān)鍵字,我們就放心了。

我們?cè)倩仡櫼幌拢?br />其流程是這樣的:在AbstractAutowireCapableBeanFactory.populateBean()->ibp.postProcessPropertyValue()->CommonAnnotationBeanPostProcessor.postProcessPropertyValue()去實(shí)例化@Resource作用的bean;

除了和處理@Autowired不是一個(gè)PostProcessor(處理@AutoWireds是用這個(gè)“AutowiredAnnotationBeanPostProcessor”PostProcessor)其他處理流程和@Autowired的處理流程一毛一樣?。?/p>

以上就是Spring Boot如何處理@Resource示例分析的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot處理@Resource的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Shiro 控制并發(fā)登錄人數(shù)限制及登錄踢出的實(shí)現(xiàn)代碼

    Shiro 控制并發(fā)登錄人數(shù)限制及登錄踢出的實(shí)現(xiàn)代碼

    本文通過(guò)shiro實(shí)現(xiàn)一個(gè)賬號(hào)只能同時(shí)一個(gè)人使用,本文重點(diǎn)給大家分享Shiro 控制并發(fā)登錄人數(shù)限制及登錄踢出的實(shí)現(xiàn)代碼,需要的朋友參考下吧
    2017-09-09
  • Java concurrency線程池之線程池原理(一)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency線程池之線程池原理(一)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Java concurrency線程池之線程池原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot中Starter的作用小結(jié)

    SpringBoot中Starter的作用小結(jié)

    這篇文章主要介紹了SpringBoot中Starter的作用小結(jié),Starter其實(shí)就是Spring針對(duì)不用的開(kāi)發(fā)場(chǎng)景,給我們提供的“套餐”。今天就通過(guò)實(shí)例代碼給大家介紹Starter,感興趣的朋友一起看看吧
    2021-10-10
  • Mybatis中流式查詢的實(shí)現(xiàn)示例

    Mybatis中流式查詢的實(shí)現(xiàn)示例

    MyBatis的ResultHandler是用于處理數(shù)據(jù)庫(kù)查詢結(jié)果集的工具,可以通過(guò)回調(diào)函數(shù)對(duì)數(shù)據(jù)進(jìn)行流式處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java實(shí)現(xiàn)產(chǎn)生隨機(jī)字符串主鍵的UUID工具類(lèi)

    Java實(shí)現(xiàn)產(chǎn)生隨機(jī)字符串主鍵的UUID工具類(lèi)

    這篇文章主要介紹了Java實(shí)現(xiàn)產(chǎn)生隨機(jī)字符串主鍵的UUID工具類(lèi),涉及java隨機(jī)數(shù)與字符串遍歷、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • java?Map.Entry的使用示例

    java?Map.Entry的使用示例

    Map.Entry是Java中Map接口的嵌套接口,它提供了獲取鍵和值的方法及遍歷和操作Map的鍵值對(duì),本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-11-11
  • 基于Spring Boot應(yīng)用ApplicationEvent案例場(chǎng)景

    基于Spring Boot應(yīng)用ApplicationEvent案例場(chǎng)景

    這篇文章主要介紹了基于Spring Boot應(yīng)用ApplicationEvent,利用Spring的機(jī)制發(fā)布ApplicationEvent和監(jiān)聽(tīng)ApplicationEvent,需要的朋友可以參考下
    2023-03-03
  • Java如何配置IDEA自定義注釋

    Java如何配置IDEA自定義注釋

    在IDEA中設(shè)置自動(dòng)創(chuàng)建類(lèi)和方法的注釋可以提高編碼效率,確保代碼的一致性和可讀性,首先,對(duì)于創(chuàng)建類(lèi)的注釋,可以通過(guò)修改File→Settings→File and Code Templates→Class的模板來(lái)實(shí)現(xiàn),其次,對(duì)于方法注釋
    2024-10-10
  • Java利用HttpClient模擬POST表單操作應(yīng)用及注意事項(xiàng)

    Java利用HttpClient模擬POST表單操作應(yīng)用及注意事項(xiàng)

    本文主要介紹JAVA中利用HttpClient模擬POST表單操作,希望對(duì)大家有所幫助。
    2016-04-04
  • SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問(wèn)的詳細(xì)過(guò)程

    SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問(wèn)的詳細(xì)過(guò)程

    Spring Boot 底層都是采用 SpringData 的方式進(jìn)行統(tǒng)一處理各種數(shù)據(jù)庫(kù),SpringData也是Spring中與SpringBoot、SpringCloud 等齊名的知名項(xiàng)目,下面看下SpringBoot Mybatis Druid數(shù)據(jù)訪問(wèn)的詳細(xì)過(guò)程,感興趣的朋友一起看看吧
    2021-11-11

最新評(píng)論