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構造を参照し、プロキシを返すことができます