Spring理論とソースコード解析シリーズ(7) – Spring AOP実装プロセスと実際の戦闘

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...

第二に、Spring AOP

1. Spring AOPとは何ですか?

Spring AOPはSpringのコアフレームワークの重要な部分であり、JavaをAOPの実装言語として使用しています。 AspectJのAOP実装との違いは、Spring AOPはメソッドレベルの傍受のみをサポートしていることです。

2、春のAOPの構成

Spring AOPには、主にJoinpoint、Pointcut、Advice、Aspect、以下のものが含まれています。

(1)Joinpoint

クロスカットロジックをOOPモジュールに織り込むと、どの実行ポイントが製織されているかを知る必要があります。 これらの実行ポイントはJoinpointと呼ばれます。

(一般的なポイントの理解:Joinpointは、クロスカット・ロジックを挿入する場所を指定するポイントです)

Spring AOPはメソッドレベルのJoinpointウィービングのみをサポートしているので、この範囲を超えるとAspectJなどを操作する必要があります。

(2)ポイントカット

Pointcutsは、通常、条件に一致する複数のメソッドセットを記述するために正規表現を使用します。

Spring AOPで提供されるPointcutインタフェースの定義を見てみましょう:

<! – waver.setProxyTargetClass(true);またはweaver.setOptimize(true);

==(2)ProxyFactory実装の原則==
ProxyFactoryがウィービングプロセスをどのように実装し、プロキシオブジェクトを返すかを見てみましょう。 まず、ProxyFactoryクラスの階層は次のとおりです。
这里写图片描述
ProxyFactoryがProxyCreatorSupportクラスを継承し、ProxyCreatorSupportがAdvisedSupportクラスを継承することがわかります.AdvisedSupportはProxyConfigクラスを継承し、Advisedインターフェイスを実装します。AdvisedSupportを見て、AdvisedSupportの略語を見てみましょう。

I)AdvisedSupportクラス</>この図からわかるように、AdvisedSupportはProxyConfigクラスを継承し、Advisedインターフェイスを実装しているため、AdvisedSupportが保持する情報は2つのカテゴリに分かれています。

ProxyConfig:生成されたプロキシオブジェクトの制御情報を記録する。
アドバイス:ターゲットクラス、アドバイザー、アドバイスなどのプロキシオブジェクトを生成するために必要な情報を記録します。

ProxyConfig:生成されたプロキシオブジェクトの制御情報を記録し、5つの属性を含む通常のJavaBean。
org.springframework.aop.framework.ProxyConfig

proxyTargetClass:プロパティをtrueに設定すると、クラスベースのプロキシメソッドが使用されます。つまり、ターゲットオブジェクトはCGLIBによってプロキシされ、デフォルトはfalseです。
最適化:trueの場合、CGLIBを使用してターゲットオブジェクトをプロキシします。デフォルトはfalseです。
不透明(Opaque):生成されたプロキシオブジェクトを強制的にアドバイスされた型に変更できるかどうかを制御します。デフォルトはfalseです。
exposeProxy:生成されたプロキシオブジェクトをThreadLocalにバインドできます。デフォルトはfalseです。
Frozen:trueに設定すると、生成されたプロキシオブジェクト情報は変更できません。

アドバイス:生成されたプロキシオブジェクトに関する具体的な情報を提供します。プロキシクラスはどのオブジェクトに対して生成されるか、追加されるクロスカットロジックはどのようになりますか?
返された代理オブジェクトは、アドバイスされた型に変換することができるので、代理オブジェクト内の関連するターゲットクラス、アドバイスなどを照会することができ、アドバイザーの追加や削除などの操作を行うことができる。
org.springframework.aop.framework.Advised

II)ProxyCreatorSupport
ProxyCreatorSupportは、ProxyClreatorSupportクラスにいくつかの一般的なロジックを抽出します。これはAdvisedSupportクラスを継承しているため、ProxyConfigおよびAdvised関数もあります。
ProxyCreatorSupportは内部的にAopProxyFactoryのインスタンスを保持します。

III)ProxyFactory
ProxyFactoryはProxyCreatorSupportを継承していますが、ProxyCreatorSupportは内部的にAopProxyFactoryのインスタンスを保持しているため、ProxyFactoryはAopProxyFactoryによって生成されたプロキシオブジェクトを取得できます。
这里写图片描述

<! – @ EnableAspectJAutoProxy(proxyTargetClass = true)は、クラスベースのプロキシモードを設定し、アスペクトアスペクトを@Aspect 、アノテーションに@Aspectアノテーションを付け、Pointcutとアスペクトクラスにさまざまなアドバイスを設定します。
最後に、ターゲットクラスを開始すると、Aspectのクロスカットロジックを持つさまざまなアドバイスが有効になっていることがわかります。

1、Pointcutの@AspectJ形式 – @Pointcut

@Pointcut@Aspect定義内にある必要があり、共通の実行は指定されたメソッドで署名されたJoinpointと一致します。

@Aspectフォームで宣言されたすべてのPointcut式は、Spring AOP内の特定のPointcutオブジェクトに解析されます(Spring AOPには独自のPointcutインターフェイスがあります)。つまり、 @Aspect宣言されたPointcutは、AspectJ専用のPointcut実装に変換されます。

2、@AspectJの形式のアドバイス

@AspectJという形式のアドバイスアノテーションには、 @AspectJものがあります。

@Before:Pre-Advice、Pointcutが実行される前に実行されます。
@After:Post-Advice; finallyメソッドと同様、Pointcutで定義されたメソッドが例外をスローしても、アドバイスの後に実行されます。
@AfterReturning:宣言はアドバイスを返し、AfterReturning Adviceはpointcutによって定義されたメソッドの通常の実行の最後に実行されます。
@AfterThrowing:Exception Advice:Pointcutで定義されたメソッドが例外をスローしたときに実行されます。
@Around:サラウンドアドバイス。ポイントカットで定義されたメソッドの前後に実行できます。

具体的な使用方法は上の例に示されているので、ここでは繰り返しません。

3. @AspectJフォームの様子@ @ Aspect

アスペクトのAspectJ形式は、アスペクトアスペクトのアドバイスの実行順序に注意する必要があります。

アドバイスが同じアスペクト内で宣言された場合、最初に宣言されたアドバイスは高い優先度を持ちます。
Before Adviceの場合、優先度が高いほど最初に宣言します。実行が速くなります。
AfterReturning Adviceの場合、より高い優先度が宣言されますが、後で実行されます。

Adviceが異なるAspectで宣言されている場合、各AspectはOrderedインターフェイスを実装し、order属性を設定する必要があります。順序が小さいほど優先順位が高くなります。

栗を与える:

<! – @ EnableAspectJAutoProxy(proxyTargetClass = true)
設定ファイルに注釈を付けたり追加したりする
<aop:aspectj-autoproxy proxy-target-class="true"/>
全体の製織プロセスを完了することができます。

第5に、スキーマフォームに基づくSpring AOP

スキーマベースのAOPは、スキーマのXML構成に基づいて、ユニークな名前空間を提供するAOPの使用に新たに追加されたものです。

スキーマフォームに基づいてSpring AOPを使用するには、IoCコンテナの設定ファイルで、以下に示すように、スキーマベースのXMLとファイルヘッダ内のAOP名前空間宣言を使用する必要があります。

 <?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

</ beans> - >

Schemaフォームに基づくSpring AOPの使用方法も比較的簡単です。これはおおよそ次のようなものですが、詳細はここでは説明しません。詳細は、公式ドキュメントを参照してください。

 //1 目标类
public class Target {
public void target(){
System.out.println("============target正常方法开始执行了============");
}
}

//1 目标类
public class Target {
public void target(){
System.out.println("============target正常方法开始执行了============");
}
}

// 2ファセットクラス
パブリッククラスSecurityAspect {

public void beforeMethod(){
System.out.println( "SecurityAspect1 beforeMethod ..");
}

public void aftetReturningMethod(){
System.out.println( "SecurityAspect1 aftetReturningMethod ....");
}

}
//スキーマに基づくSpring AOPの3実装
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
Xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
Xmlns:context = "http://www.springframework.org/schema/context"
Xmlns:aop = "http://www.springframework.org/schema/aop"
Xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop。 Xsd ">

<bean id = "target" class = "com.wgs.aop.Target"> </ bean>
<bean id = "securityAspect" class = "com.wgs.aop.SecurityAspect"> </ bean>
<aop:config proxy-target-class = "true">
<aop:pointcut id = "pointcutName" expression = "実行(* com.wgs.aop.Target.target())"> </ aop:pointcut>
<aop:aspect ref = "securityAspect" order = "1">
<aop:beforeメソッド= "beforeMethod" pointcut-ref = "pointcutName" />
<aop:after-returningメソッド= "aftetReturningMethod" pointcut-ref = "pointcutName" />
</ aop:aspect>
</ aop:config>
</ beans>

// 4テスト
パブリックstatic void main(String [] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml");
ターゲットターゲット=(ターゲット)ctx.getBean( "ターゲット");
Target.target();
}
- >

出力:

SecurityAspect1 beforeMethod ....
============ target通常のメソッドが実行を開始する============
SecurityAspect1 aftetReturningMethod ....

<aop:config><aop:pointcut><aspect>などのタグに基づいて必要なウィービング情報を取得し、次にコンテナに登録されたBeanを取得する自動プロキシメカニズムを使用して、スキーマに基づく基本AOPを実装します。自動プロキシ

スキーマの形式でのSpring AOPの使用はここでは紹介されておらず、自己表示に興味があります。

ここでは、Spring AOPの基本を紹介します。Spring AOPメカニズムのソースコード解析については、以下で説明します。


ニュージャージー州の2018/03/20


1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...
      この投稿は審査処理中  | 元のサイトへ