Springのaop実現

8161 ワード

参照
Springはノートの(二)-AOPとInterceptorのspring AOP概念を使ってAOP-Filterを説明します.フィルタとスクリーンの違い.
AOPの原理
AOP紹介
AOP:Asppect Oriented Programingは、切断面に向かってプログラミングします.切面向けプログラミング(AOP)は、対象向けプログラミング(OOP)に対して他のプログラム構造上の補足であり、OOPのコア単位はクラスであり、AOPのコア単位はaspect(切面)である.切面は、事務管理のような横接の異なるタイプと対象に対する論理がモジュール化される.
アプリケーションシーン
AOPの主な機能はログ記録、性能統計、セキュリティコントロール、事務処理、異常処理などです.主な意図は、ログ記録、性能統計、セキュリティコントロール、事務処理、異常処理などのコードを業務論理コードから分離し、これらの行為を分離することによって、非指導業務論理の方法に独立して、業務ロジックに影響を与えないコードに変えたいということです.
AOPメリット
  • モジュールの結合度を下げる
  • は、システムを容易に拡張する
  • .
  • 設計によって決定された遅いバインディング:AOPを使って、デザイナーは将来の需要に応じて決定を遅らせることができます.このような需要を独立した面で簡単に実現できるからです.
  • より良いコード多重化
  • AOPコンセプト
    1.Asppectは、上記のログコンポーネントのように、注目点のモジュール化を横断します.強化、導入、および切り込み点の組み合わせと考えられます.SpringではSchemaと@AsppectJ方式で組織的に実現できます.AOPでは「どこで何をしていますか?」と表示されます.
    2.Join pointプログラムに注目点を横に挿入する必要がある拡張点を示し、接続点はクラス初期化、方法実行、方法呼び出し、フィールド呼び出しまたは処理異常などの可能性があり、Springは方法のみをサポートして接続点を実行し、AOPでは「どこでやりますか?」と表しています.
    3.Adviceは特定の接続点で行われる動作で、タイプはアロント、before、afterなどを含み、Springでadviceはinterceptorモードであり、アロnd接続点のinterceptorチェーンを含む.
    4.Pointcutは関連する接続点のセットを選択し、すなわち接続点のセットを選択し、Springはperl 5正則表現とAsppectJ切り込みポイントパターンをサポートし、SpringはデフォルトでAsppectJ文法を使用し、AOPでは「どこでセットしたか」を表します.
    5.Introductionは、他のタイプの方法またはフィールドを宣言し、Spring AOPは、新しいインターフェース(および対応する実装)の任意のadvisedオブジェクトの導入を許可する.
    6.Target objectは一つ以上の断面advisedオブジェクトにより、SprigAOPから代理運転が開始され、このオブジェクトはずっと代理対象です.
    7.AOP proxy AOPフレームで作成したオブジェクトは、このオブジェクトはaspectルール(advise方法実行など)を実現しています.Springフレームで、一つのAOPエージェントはJDKダイナミックエージェントまたはCGLOIBエージェントです.
    8.Weaving編入は一つのプロセスであり、切面をターゲットオブジェクトに適用してAOP代理オブジェクトを作成するプロセスであり、編入はコンパイル期間、クラス積載期間、運行期間で行うことができる.
    9.Adviceタイプが接続点で実行する行為は、AOPでは切り込み点で選択された接続点で既存の行動を拡張する手段を提供する.Springでは、プロキシモードによりAOPを実現し、インターロックモードにより接続点を囲むブロックチェーンを強化する.AOPには「何をするか」と表示されます.
  • Before advice:接続点の前に実行すると、AOPが接続点を実行するのを止めることができません.
  • After returning advice:1つの接続点が正常に完了した後に実行します.例えば、1つの方法が正常に戻り値を返し、異常を投げませんでした.
  • After throwingg advice:もし一つの方法が異常を投げて退出したら、このAdvice
  • を実行します.
  • After(finally)advice:方法が正常に戻るか、それとも異常があるかに関わらず、このAdvice
  • を実行します.
  • Asound advice:方法beforeの前とafterの後でAdviceを実行してもいいし、後に続くかどうかを決定してもいいし、カスタム値に戻るか、または異常を投げることもできます.
    10.AOPエージェントSpring AOPは標準的なJ 2 SE動的エージェントを使用しています.任意のインターフェースを代理できます.CGLOIBエージェントを使用しても良いし、一つのサービスオブジェクトがインターフェースを実装していない場合は、デフォルトではCGLOIBエージェントを使用しますが、インターフェース向けプログラミングを使用することを推奨します.
    AOPのいくつかの実現
    AOPのSpringでのサポート
  • プロキシベースの古典的なAOP(プロキシインターフェースのみ)
  • @AsppectJに基づいて駆動されるタンジェント(プロキシのみ)
  • 純POJOカット
  • 注入式AsppectJカット
  • XML設定方式
    このようにして、execution構成の全パケットのインターフェースに直接接面を追加して処理することができる.
    
        
            
            
            
        
    
    
    
    package com.myparamita;
    
    public class TestInterceptor {
    
        public void after() {
            System.out.println("After");
        }
    
        public void before() {
            System.out.println("before");
        }
    }
    
    mvc:interceptors方式
    スプリングmvcのスクリーンセーバーを使用して実装すると、スクリーンセーバは複数の同時構成が可能であり、構成の順序に従って実行されてもよく、スクリーンセーバに構成されているルールを直接ブロック処理することができる.
    package com.myparamita.interceptors;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ControllerInterceptor implements HandlerInterceptor {
    
        long inTime;
    
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            inTime = System.currentTimeMillis();
            System.out.println("in controller: "+request.getServletPath());
            return true;
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                               ModelAndView modelAndView) throws Exception {
    
            long timeGap = Math.abs(System.currentTimeMillis() - inTime);
            System.out.println("out controller: "+"{\"controllerPath\":\"" + request.getServletPath() + "\",\"timeGap\":" + timeGap + "}");
        }
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
    
        }
    }
    
    
    
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    
    
    純粋な注釈方式
    このように構成は、注釈によってブロック類に設定されています.
    package com.myparamita.aop;
    
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class LogInterceptor {
    
        @Pointcut("execution(public * com.myparamita.controller.*.*(..))")
        public void myMethod() {
        }
    
        @Before("myMethod()")
        public void before() {
            System.out.println("=========================================method start");
        }
    
        @After("myMethod()")
        public void after() {
            System.out.println("=========================================method after");
        }
    }
    
    springプロファイルに追加:
          
        
    
    Springで定義されているMethodInterceptor
    Springでは、4つのAdviceを提供し、メソッド呼び出し時の行動の違いをサポートします.
  • Before Advice:具体的なインターフェース:MethodBefore Adviceターゲットメソッドの呼び出し前に呼び出すAdvice
  • AfterAdvice:具体的なインターフェース:AfterReturningAdviceは、ターゲット方法で起動し、リターンした後に呼び出すAdvice
  • です.
  • ArondAdvice:デバイスインターフェース:MethodInterceptorは、ターゲット方法の全体の実行前後で有効であり、目標方法の実行を制御する能力がある
  • .
  • Throws Advice:具体的なインターフェース:Throws Adviceターゲットメソッドに異常がある場合に呼び出すAdvice
  • 以上の4つのAdviceの中で一番特別なのはMethodInterceptorです.その特別なところは、まず彼がいるカバンはSrpingの中のカバンではなく、org.aopalliance.interceptカバンです.つまりMethodInterceptorがAOPインターフェースを実現しました.この点は他のAdviceより汎用性が高いことを保証します.AOPインターフェースに基づいて実装される任意のAOPシステムで使用できます.第二のポイントは、他のAdviceに匹敵しない機能です.目標方法の実行全体が前後有効であり、目標方法の実行を制御する能力があります.
    package com.myparamita.aop;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class TestInterceptor implements MethodInterceptor {
    
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
    
            System.out.println("======================before====");
    
            //                   
            Object ret = invocation.proceed();
            System.out.println("======================after====");
            return ret;
    
        }
    }