ダボサービスから消費者を停止

ReferenceAnnotationBeanPostProcessorインターフェイスpostProcessPropertyValues InstantiationAwareBeanPostProcessorAdapterアプローチを実装AnnotationInjectedBeanPostProcessors、スワス@Reference注釈付き注射ReferenceBeanオブジェクトのメンバを継承しました。

@Override
     公共PropertyValuesのpostProcessPropertyValues(
            PropertyValuesのPVSは、のPropertyDescriptor []はPDS、オブジェクト豆、文字列のbeanName)がスローBeanCreationException { 

        InjectionMetadataメタ = findInjectionMetadata(のbeanName、bean.getClass()、PVS)。
        試す{ 
            metadata.inject(豆、のbeanName、PVS)。
        } キャッチ(BeanCreationExceptionのEX){
             スローEXと、
        } キャッチ(ThrowableのEX){
             スロー 新しい、BeanCreationException(のbeanName "の注入を@" +。getAnnotationType()のgetName()
                     + "依存関係の失敗した" 、EX); 
        } 
        戻りPVSと、
}

findInjectionMetadataは、すべてのフィールドとメソッドを識別し@Referenceメタデータにパッケージ内metadata.inject法、方法は、注射、およびその後のAnnotatedFieldElementを注入メソッドを呼び出すinjectElement呼び出します。

 パブリック クラス AnnotatedFieldElementは延びInjectionMetadata.InjectedElement { 

        民間 最終フィールドのフィールドと、

        民間 最終注釈。

        プライベート 揮発性オブジェクトBean。

        保護AnnotatedFieldElement(フィールドフィールド、注釈){
             スーパー(フィールド、NULL );
            この選択図】図= フィールド。
            この .annotation = 注釈。
        } 

        @Overrideは、
        保護された ボイド注入(オブジェクト・ビーン、文字列のbeanName、PropertyValuesのPVS)はスロースロー可能{ 

            クラス injectedType = <?> field.getType(); 

            オブジェクトinjectedObject = getInjectedObject(注釈、豆、のbeanName、injectedType、この)。

            ReflectionUtils.makeAccessible(フィールド); 

            field.set(豆、injectedObject)。

        } 

    }

 

 保護されたオブジェクトgetInjectedObject(注釈、オブジェクトBeanは、文字列のbeanName、クラス<?> injectedType、
                                       InjectionMetadata.InjectedElement injectedElement)スロー例外{ 

        文字列cacheKey = buildInjectedObjectCacheKey(注釈、豆、のbeanName、injectedType、injectedElement)。

        オブジェクトinjectedObject = injectedObjectsCache.get(cacheKey)。

        もし(injectedObject == NULL ){ 
            injectedObject = doGetInjectedBean(注釈、豆、のbeanName、injectedType、injectedElement)。
            // 必要に応じて、注入先のオブジェクトをカスタマイズ
            injectedObjectsCache.putIfAbsent(cacheKey、injectedObject)。
        } 

        戻りinjectedObject。

    }

ReferenceAnnotationBeanPostProcessorの書き換えられDoGetInjectedBean:

@Override
     保護オブジェクトdoGetInjectedBean(<?>参照基準、オブジェクト豆、文字列のbeanName、クラスinjectedType、
                                       InjectionMetadata.InjectedElement injectedElement)スロー例外{ 

        文字列referencedBeanName = buildReferencedBeanName(参照、injectedType)を、

        ReferenceBean referenceBean = buildReferenceBeanIfAbsent(referencedBeanName、参照、injectedType、のgetClassLoader())。

        cacheInjectedReferenceBean(referenceBean、injectedElement)。

        オブジェクトプロキシ = buildProxy(referencedBeanName、referenceBean、injectedType)。

        リターンプロキシ。
    }

ここでは、実際のプロキシが実際に噴射され、referenceBean構造を参照し、プロキシを返すことができます

おすすめ

転載: www.cnblogs.com/lccsblog/p/11627253.html