Springbootアクチュエータ12:アクチュエータAOP

はじめに
スプリングAOPは、今、私たちは分析する必要がありますか?春のブート設定を自動化することがいかにの中核概念であり、

分析
の自動化構成のみAOPについてorg.springframework.boot.autoconfigure.EnableAutoConfiguration /META-INF/spring.factoriesの読み取り値を読み取るように構成されたスプリングブート、すなわちorg.springframework.boot.autoconfigure.aop .AopAutoConfiguration。このクラスは、胸を開くための鍵です

AopAutoConfigurationは、次のコメントを宣言します。

@Configuration
@ConditionalOnClass({EnableAspectJAutoProxy.class、Aspect.class、Advice.class})
@ConditionalOnProperty(接頭辞= "Spring.Aop"、名前= "オート"、havingValue = "真の"、真matchIfMissingへ=)
。1
2
3
@コンフィギュレーション- >構成クラス
@ConditionalOnClass({EnableAspectJAutoProxy.class、Aspect.class、Advice.class }) - > このような構成のみAdvice.class解決された現在のクラスパス、Aspect.class、でEnableAspectJAutoProxy.class存在
@ConditionalOnProperty (接頭辞= "spring.aop"、名前は = "オート"、havingValueは= "true"を、matchIfMissing =真)は- > spring.aop.auto =真で構成されたときに設定されていない、それはデフォルトで有効にする場合に有効になります。
AopAutoConfigurationのみ二つの内部クラス:

次のようにJdkDynamicAutoProxyConfiguration、コードは次のとおりです。

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass =偽)
@ConditionalOnProperty(接頭辞= "spring.aop"、NAME = "プロキシターゲットクラス"、havingValue = "false"を、matchIfMissing =真)
パブリック静的クラスJdkDynamicAutoProxyConfiguration {

}
。1
2
3
4
5。
6。
@Configuration - >構成クラス
@EnableAspectJAutoProxy(proxyTargetClass =偽) -解析続い>開くAOPアノテーション、上の注釈、
@ConditionalOnProperty(接頭辞= "Spring.Aop"、名前=「PROXYクラスをターゲット「havingValue =」 )、「偽真matchIfMissing = - > 。開始を有効にするにはデフォルトで設定されていない場合は、偽= spring.aop.proxy-ターゲット・クラスを配置されたときに
、次のようにCglibAutoProxyConfiguration、コードは次のとおりです。

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass =真)
@ConditionalOnProperty(接頭辞= "spring.aop"、NAME = "プロキシターゲットクラス"、havingValue = "TRUE"、matchIfMissing =偽)
パブリック静的クラスCglibAutoProxyConfiguration {

}
。1
2
3。
4。
5。
6。
@Configuration - >構成クラス
@EnableAspectJAutoProxy(proxyTargetClass =偽) - >開くAOPアノテーション
@ConditionalOnProperty(接頭辞= "spring.aop"、 NAME = "プロキシターゲットクラス"、havingValue =「真」偽matchIfMissing =) -設定されていない場合>現在の設定spring.aop.proxy-対象クラスの場合=力に真のエントリー、デフォルトでは有効ではない。
したがって、我々は、AOPのデフォルトJdkDynamicAutoProxyConfigurationたちとのライン上でこのの発効を知ることができます。認知スプリングAOPデフォルトのJDKが使用され、使用のためのプロキシクラスならば、真= spring.aop.proxy-対象クラスを設定し、プロキシが使用されているCGLIB

次のように@EnableAspectJAutoProxyコードは次のとおりです。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@import(AspectJAutoProxyRegistrar.class)
パブリック@interface EnableAspectJAutoProxy {

//示すベースのプロキシかどうか、偽- >インタフェース用のプロキシ(Javaの動的プロキシ)を使用して.TRUE - > CGLIB使用
ブールはfalseデフォルトにproxyTargetClassを();

//は(ThreadLocalのを経由して)薬剤への曝露は、この属性がtrueに設定されているかどうかを示す当該切断拡張実施例を呼び出すことができないオブジェクト内のターゲットを自己解決する。
falseにexposeProxy()デフォルトブール;
}
。1
2
3。
4。
5。
6。
7つの
8
9
10
11
12
リスク・ソリューションオブジェクト内のターゲット上で呼び出すときに問題になっている強化されたセクションでは、春のトランザクション処理と、このブログのいくつかの実装を見ることができます実装されることはありません自己自身を呼び出します

ここで@import(AspectJAutoProxyRegistrar.class)によって、AspectJAutoProxyRegistrar構成を導入しました。

AspectJAutoProxyRegistrarがImportBeanDefinitionRegistrarインターフェイスを実現しているためか、以前の記事から見て、この時間は。ConfigurationClassParser番号のprocessImportsと呼ばれる、それが対応するimportBeanDefinitionRegistrars JdkDynamicAutoProxyConfigurationのConfigurationClassに追加されます。

最後に、registerBeanDefinitions ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsFromRegistrarsますimportBeanDefinitionRegistrarsそのメソッドを呼び出すためです。

AspectJAutoProxyRegistrar#のregisterBeanDefinitionsコードは次のとおりです。

公共のボイドregisterBeanDefinitions(
AnnotationMetadata importingClassMetadata、BeanDefinitionRegistryレジストリ){

AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(レジストリ);

AnnotationAttributes enableAspectJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata、EnableAspectJAutoProxy.class)。
IF(enableAspectJAutoProxy.getBoolean( "proxyTargetClass")){
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(レジストリ)。
}
(enableAspectJAutoProxy.getBoolean( "exposeProxy")){もし
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(レジストリ)。
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
org.springframework.aop.config.internalAutoProxyCreatorのための登録IDは、クラスは次のようにコードがあり、最終的に呼び出しAopConfigUtils番号registerOrEscalateApcAsRequired法と呼ばれる豆の層を通ってここにAnnotationAwareAspectJAutoProxyCreatorです。

静的BeanDefinition registerOrEscalateApcAsRequiredプライベート(クラスCLS、BeanDefinitionRegistryレジストリ、オブジェクトソース<?>){
Assert.notNull(レジストリ、「BeanDefinitionRegistryないNULLでなければなりません」);
//すでに自動プロキシクリエータと自動プロキシクリエータの存在を持っている場合最後に必要にそれほど矛盾状況の使用必要とする優先度に応じて決定される
IF(registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME))は{
BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
!。IF(cls.getName()に等しい(apcDefinition.getBeanClassName ())){
int型= currentPriority findPriorityForClass(apcDefinition.getBeanClassName());
INT = requiredPriority findPriorityForClass(CLS);
IF(currentPriority <requiredPriority){
//最も重要な変更は、クラス名を対応するBean Beanを変更することです
apcDefinition.setBeanClassName(cls.getName());
}
}
//自動プロキシクリエータと、作成する一貫したがすでに存在する場合は、もう一度作成する必要が
ヌルを返します。
}
RootBeanDefinition BeanDefinition =新新RootBeanDefinition(CLS);
beanDefinition.setSource(ソース)
。beanDefinition.getPropertyValues()を追加( "注文"、Ordered.HIGHEST_PRECEDENCE);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME、BeanDefinition);
BeanDefinitionを返す;
}
1
2
3。
4。
5。
6。
7。
8。
9
10
11
12である
13である
14
15
16
17
18
19
20
21
22
23
の着信CLS AnnotationAwareAspectJAutoProxyCreator.classに
すでに自動プロキシクリエータを持っており、自動プロキシクリエータを使用すると、優先順位に基づいて使用するかを決定する必要があり、最終的に既存の現状と矛盾している場合- >この場合は高AnnotationAwareAspectJAutoProxyCreator登録優先度よりも、着信の優先順位が交換されるAnnotationAwareAspectJAutoProxyCreator。その後、直接リターン
すでに(AnnotationAwareAspectJAutoProxyCreator)が作成される自動プロキシクリエータとそれと一致し、直して作成する必要がある場合に
登録は、idがありますorg.springframework.aop.config.internalAutoProxyCreator、クラスは、優先順位はInteger.MIN_VALUE AnnotationAwareAspectJAutoProxyCreatorである。内部使用のためにロール
の真にproxyTargetClassが等しく設定されている場合、org.springframework.aop.config.internalAutoProxyCreatorのIDがBeanDefinitionのproxyTargetClassを追加します次のように真のコードの属性値は次のとおりです。

静的ボイドforceAutoProxyCreatorToUseClassProxying公開(BeanDefinitionRegistryレジストリ){
(registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)){IF
BeanDefinition定義= registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)
。definition.getPropertyValues()を追加し(にBoolean.TRUEの"proxyTargetClass");
}
}
。1
2
3
。4
。5
。6
trueにexposeProxyが等しく設定した場合、IDはorg.springframework.aop.config.internalAutoProxyCreator BeanDefinitionであるexposeProxy値が真のコードされた属性を加え、以下の通りであります:

静的ボイドforceAutoProxyCreatorToExposeProxyパブリック(BeanDefinitionRegistryレジストリ){
IF(registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)){
BeanDefinition定義= registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)
。definition.getPropertyValues()を追加し(にBoolean.TRUEの"exposeProxy");
}
}
。1
2
3
4
5
6
ソースAOPの側面については、こちらを解決するためのバネブート時に、深さの秘密に春にAOP自動設定を一つずつ用意しました。
--------------- ------
免責事項:CSDNの記事ブロガーの元の記事に「ファームヤードの努力」、著作権の契約は、再現し、元のソースのリンクと、この文を添付してくださいBY-SA CC 4.0に従ってください。
オリジナルリンクします。https://blog.csdn.net/qq_26000415/article/details/79010971

おすすめ

転載: www.cnblogs.com/duanxz/p/11328712.html