暖かく推奨:スーパーマルチITリソースを、すべて798資源のネットワークに
免責事項:、記事を転載このバックアップの損失を防ぐためにそうします。
ハート手順:公共の数字からこの記事
オリジナル住所:https://mp.weixin.qq.com/s/vo94gVyTss0LYwEcRx4iiw
AOP、プログラム開発と略記アスペクト指向プログラミングは、主に、ロギング、トランザクション、およびその他の権限などのシステムレベルでの問題の一部を解決するために使用されます。アリシステム、AOPは
広く、ティソログ、ローカルキャッシュに使用される運命とそのシーンを高めています。
AOPの基本的な概念
なぜ指向プログラミング?この問題を解決するためのオブジェクト指向プログラミングパッケージが、また新たな問題をもたらした、オブジェクトのメソッドを強化する方法?例えば、インタフェースAは、複数の実装クラスを持っているかもしれA1、A2、******、Anは、どのようにログインするか、印刷権管理方式と同じ実装クラスのためのより多くのですか?オブジェクト指向のツールの一般的な考え方は、一般的にパッケージされ、その後、非常に、面倒な維持が困難になり、もう一度コードを強化するために行われる必要があり、すべてのメソッドに追加します。したがって、唯一のアスペクト指向プログラミング。
次の図は、アスペクト指向プログラミング、ビジネスロジックを達成するために、カプセル化、継承、多型、オブジェクト指向プログラミングの概念を示す特定のトランザクションのビジネスプロセス指向プログラミングHengdao処理部カットします。クロス刺し、コールはこのから切り出されます。
図指向プログラミングから見ることができ、ビジネスロジックの一部が、そのようなログ、アクセス権などの特定のビジネス固有のサービスの独立していません。アスペクト指向プログラミングを理解するには、次の概念があります。
- (1)アスペクト(セクション):通常クラス、ポイントカットとを定義することができます。
- (2)JointPoint(接続点):クリアプログラム実行ポイント中、一般的なメソッドが呼び出されます。
- (3)情報(通知):AOPは、特定のエントリポイントに強調処理を実行する前処理、後処理、例外処理などであってもよいし、
- (4)ポイントカット(エントリポイント):結合点は、主に、プログラムのエントリポイント書かれた表現に反映される通知と、
- (5)AOPプロキシ:AOPフレームワークで作成されたオブジェクトは、エージェントは、ターゲット・オブジェクトを強化することです。
- 新しいプロキシオブジェクトを作成するプロセスを対象物に印加部(6)に織り込ま。
一般的にウィービングは、いくつかの時間に発生します。
- (1)コンパイル:それを行うことができ、特別なコンパイラを必要と織りのためのファイルがコンパイルされたクラス、例えば、織りAspectJのコンパイラ。
- (2)クラスローダとき:特別なクラスローダのターゲットクラスの使用はプログラムの前に強化されたバイトコードのクラスにロードされます。
- (3)操作:セクションは、いくつかの点の実行時に織り込まれています。
春AOP
春はサポートAOPに依存する特別なパッケージを提供します。スプリングAOPプロキシにJDKダイナミックプロキシとなり、プロキシはCGLIBであってもよいです。プロキシの生成、管理、およびその依存関係は、IOCコンテナの責任である、春は必要にJDKダイナミックプロキシデフォルトのプロキシクラスを使用しているのではなく、エージェントインターフェースは、春には、自動的にCGLIBエージェントを使用するように切り替わりますとき。
春はAOPを達成するために、いくつかの方法が用意されています。
- セクション・インターフェースに基づいて:インターフェース実現方法は、ポイントカットとを定義します。
- 注釈ベースのセクション:基づき@アスペクト、ポイントカット@、@、@ AfterReturningおよび他の注釈AOPの方法の前に、
- XMLベース部:例えばAOPとして、XML名前空間を使用して、AOP:アスペクト。
ここで紹介するより簡単な方法ベースのインタフェースを使用し、他のいくつかのタイプを導入します。スプリングは、アドバイザインターフェースは情報を含む一般的なセクション、ないエントリポイントを表す使用します。
public interface Advisor {
//获取 Advice
Advice getAdvice();
//暂不用
boolean isPerInstance();
}
PointcutAdvisorインタフェースは、アドバイザを拡張し、2ポイントカットアドバイスとクラスを含むカットの開始点を表します。PointcutAdvisorインタフェースは、カットに基づいて、クラスのメソッド名、コメントおよびその他の情報により接続され、カット点を定義するより適用部を提供するための柔軟性を定義することができます。
public interface PointcutAdvisor extends Advisor {
//获取 Pointcut
Pointcut getPointcut();
}
スプリングは、6つのPointcutAdvisorインタフェースの実装クラスを提供し、以下のように、セクションは、6つのタイプを定義しています。
- DefaultPointcutAdvisor:カットの最も一般的なタイプは、それが任意のポイントカットとアドバイスによって定義されたセクションことができます。
- NameMatchMethodPointcutAdvisor:メソッドのクラス名でセクションによってカットポイントを定義定義することができます。
- RegexpMethodPointcutAdvisor:接線点によって定義されたメソッド名を一致させるための正規表現のためのプレスセクション、実装クラスを拡張することによって操作することができます。
- StaticMethodMatcherPointcutAdvisor:静的メソッド定義された態様は、カットポイントをマッチャ。
- AspecJExpressionPointcutAdvisor:Aspecj接点部に対して定義された式の切削点。
- AspecJPointcutAdvisor:カットオフポイントを定義するためのAspecJ文法セクション。
春AOPはポイントカットを達成するために、組み込みのインターフェイスを数多く提供しています、我々はこれらの実装定義のエントリポイントに基づいてすることができます。一般的な実装では、次のとおりです。
- StaticMethodMatcherPointcut:静的マッチング方法、デフォルトの一致により、すべてのクラスを非動作に切断し、切断のレベルを達成する方法。
- DynamicMethodMatcherPointcut:動的なマッチング方法、カットのレベルを達成するための方法は、デフォルトですべてのクラスを一致、ランを切断し、
- AnnotationMatchingPointcut:アノテーションに基づくマッチング;
- ExpressionPointcut:AspectJのポイントカット表現の構文をサポートします。
- ControlFlowPointcut:制御フローカットオフポイントは、ターゲット・スタックに係るプログラム実行情報は、直接的または間接的にコールを開始する方法は、この方法は、接続点マッチングするかどうかを判断するかどうかをチェックし、
- ComposablePointcut:化合接点提供基づくカットポイントを複数作成するために操作しやすいです。我々は、リンク式を使用して操作することができるように、それはすべての方法は、ComposablePointcutクラスを返します。
スプリングAOPアドバイスを高める複数のサブインターフェイスをサポートするインタフェースを提供します。次のように:
- インタフェースMethodBeforeAdvice:ターゲット・メソッド呼び出しの前に呼び出されるアドバイス。
- インタフェースAfterReturningAdviceは:コールの後に呼び出し、ターゲット・メソッドのアドバイスに戻ります。
- インタフェースMethodInterceptorの:有効前後のターゲットメソッドの実行と、対象メソッドの実行を制御する機能を通じて、
- インタフェースThrowsAdviceは:アドバイスは、ターゲット・メソッドが呼び出さ例外をスローします。
AOPの使用インターフェースに基づきます
PointcutAdvisorインターフェースAOPはベースに対処するためのSpring AOPフレームワークに他の人に出発点ポイントカットとアドバイス通知を定義する必要があります。インタフェースに基づいて、PointcutAdvisor実装クラスは、セクションを定義します。
で定義されたエントリポイントgetPointcut。次の例のように、出発点は、すべてのメソッドがMyTestAnnotation注釈を持って定義することで、すべての注釈付きのメソッドは、私たちの出発点です。
@Getter
public Pointcut pointcut = new StaticMethodMatcherPointcut() {
@Override
public boolean matches(Method method, Class<?> targetClass) {
return method.getAnnotation(MyTestAnnotation.class) != null;
}
};
それはgetAdvice中)(の定義を強化するために行われる必要があります。次の例は、参照オブジェクトにMethodInvocation基準に情報部、呼び出されるメソッド、等を運ぶように、インタフェースMethodInterceptorのを高める方法を実装します。直接法では、呼び出し元のメソッドの後にメソッドを呼び出す前に、または後処理のためにオリジナルの方法、および前処理を呼び出すことができます。
@Getter
public Advice advice = (MethodInterceptor)methodInvocation -> {
// TODO 增强前置处理
// 调用原来的方法
Object result = methodInvocation.proceed();
// TODO 增强后置处理
return result;
};
AOPの注意事項
- AOPプロセスでは、あまりにも多くの時間操作を服用してはいけません:セクションとしてAOPは、印刷ログなどのプロセスの単純な取引、に焦点を当てるべきです。かかる操作は、あまりにも多くのAOPを配置すべきではない
行って、我々が対処する必要がある場合、非同期処理を行う必要があります。 - AOPは、ビジネスロジックの通常の動作には影響しませんので、キャッチを追加してください、AOP自体が異常通常の業務に影響を与えないよう:AOPは例外をスローしてはいけません。
- AOPサイクルは表示されません。特に、印刷ログのセクションでは、ループを避けるようにしてください。あなたが表示されるエラーログAOPを印刷したい場合は、サイクルを避けるために、一人で印刷してみてください。
概要
この記事では、AOPの基本的な考え方を説明春AOPベースのアスペクト指向プログラミング・インターフェースの方法を説明します。
AOPの使用の合理化は、システムの複雑さを軽減する非侵襲的なシステムの機能を向上させる、それが広くエンタープライズJavaアプリケーションで使用されてきたことができます。