Spring AOPの原理とは何ですか

coldplay.xixi
リリース: 2020-10-30 14:51:07
オリジナル
3339 人が閲覧しました

春の AOP 原則: 1. AOP はアスペクト指向であり、オブジェクト指向プログラミング OOP を改善するためにプログラム構造を検討するための別の視点を提供するプログラミング パラダイムです。2. AOP は、開発者に水平メカニズムの説明を提供します。横断的な関心事と、横断的な関心事をオブジェクト指向ソフトウェア システムに自動的に組み込むことができます。

Spring AOPの原理とは何ですか

spring aop 原則:

AOP (アスペクト指向) は、別の視点を提供するプログラミング パラダイムです。検討してみてください。オブジェクト指向プログラミング (OOP) を補完するプログラム構造。

AOP は、開発者に横断的な懸念事項を記述するメカニズムを提供し、横断的な懸念事項をオブジェクト指向ソフトウェア システムに自動的に組み込むことができるため、横断的な懸念事項のモジュール化を実現します。

AOP は、ビジネスとは関係がないものの、トランザクション処理、ログ管理、権限制御などのビジネス モジュールによって一般的に呼び出されるロジックや責任をカプセル化して、重複コードの削減を促進します。システムを統合してモジュール数を削減し、結合度を高めることで将来の運用性や保守性を向上させます。

AOP を使用するメリット

  • モジュールの結合を減らす

  • システムを拡張しやすくする

  • コードの再利用性の向上

##AOP の基本概念

  • JoinPoint: プログラムに水平線を挿入する必要がある問題となる点としては、接続ポイントはクラスの初期化、メソッドの呼び出し、フィールドの呼び出し、または例外処理などにある可能性があります。 Spring ではメソッド実行接続ポイントのみがサポートされます。

  • ポイントカット: 関連する接続ポイントのセット。

  • アドバイス: 接続ポイントで実行される動作拡張により、エントリ ポイントによって選択された接続ポイントで AOP の既存の動作を拡張する手段が提供されます。プリエンハンス(アドバイス前)、ポストエンハンス(アドバイス後)、サラウンドエンハンス(アドバイス前後)を含みます。

  • アスペクト: 通知とエントリ ポイントの組み合わせ。

  • ウィービング: ウィービングは、ターゲット オブジェクトにアスペクトを適用して AOP プロキシ オブジェクトを作成するプロセスです。

  • プロキシ: プロキシを介してターゲット オブジェクトにアスペクトを適用します。 AOP プロキシは、JDK 動的プロキシまたは CGLIB プロキシを使用して実装できます。

  • ターゲット オブジェクト: フォーカスに織り込む必要があるオブジェクト。つまり、プロキシされるオブジェクトです。

Spring AOPの原理とは何ですか#AOP を実装するための主な設計パターンは動的プロキシです。

Spring 動的プロキシには 2 つのタイプがあります: 1 つは JDK 動的プロキシ、もう 1 つは cglib 動的プロキシです。

JDK 動的プロキシ シミュレーション

JDK 動的プロキシの 2 つのコア インターフェイス (クラス) は、InvocationHandler と Proxy です。注: プロキシ インターフェイスのみを使用できます。

public class TimeHandler implements InvocationHandler {  
      
    // 目标对象  
    private Object targetObject;  
    
    public TimeHandler(Object targetObject){
          this.targetObject = targetObject;
    }
    @Override  
    //关联的这个实现类的方法被调用时将被执行  
    /*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法,      
        args表示方法的参数*/  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        Object ret=null;  
        try{  
            System.out.println("方法之前:"+System.currentTimeMillis());    
            //调用目标方法  
            ret=method.invoke(targetObject, args);  
            System.out.println("方法之后:"+System.currentTimeMillis());  
        }catch(Exception e){  
            e.printStackTrace();  
            System.out.println("error");  
            throw e;  
        }  
        return ret;  
    }  
  
}
ログイン後にコピー

TimeHandler クラスは、InvocationHandler インターフェイスを実装します。 3 つのパラメーターを持つコア メソッド呼び出しを実装します。最初のパラメータは生成されたプロキシ クラスのインスタンス、2 番目のパラメータはターゲット オブジェクトのメソッド、3 番目のパラメータはメソッドのパラメータ値の配列です。

public class ProxyUtil {
    
    @SuppressWarnings("unchecked")
    public static <T> T proxyOne(ClassLoader loader,Class<?>[] clz,InvocationHandler handler){
        return (T)Proxy.newProxyInstance(loader, clz, handler);
    }
}
ログイン後にコピー

ProxyUtil クラスは、単に Proxy.newProxyInstance() メソッドをカプセル化します。このメソッドにも 3 つのパラメータがあります。最初のパラメータはプロキシ オブジェクトのクラス ローダーを生成し、2 番目のパラメータはターゲット オブジェクトのインターフェイス配列、3 番目のパラメータは InvocationHandler インターフェイスを実装するクラス インスタンスです。

public interface UserManager {
    public void addUser(String userId, String userName);
}
public class UserManagerImpl implements UserManager {
    @Override
    public void addUser(String userId, String userName) {
        System.out.println("addUser(id:"+userId+",name:"+userName+")");
    }
}
public static void main(String[] args) {
         UserManager um=new UserManagerImpl(); 
         LogHandler log =new LogHandler(um); 
     um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), 
                 um.getClass().getInterfaces(), log);
         
       TimeHandler time = new TimeHandler(um);
       um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), 
                 um.getClass().getInterfaces(), time);
         
         um.addUser("1111", "张三");
    }
ログイン後にコピー

デモンストレーションの目的で、TimeHandler コードと同じ LogHandler がここに追加されます。

CGLIB 動的プロキシ シミュレーション

CGLIB 動的プロキシの 2 つのコア インターフェイス (クラス) は、MethodInterceptor と Enhancer です。これは JDK ダイナミック プロキシに非常に似ており、使用方法も似ています。ただし、CGLIB はクラスとインターフェイスをプロキシできます。注: 最終クラスはプロキシ化できません。

public class TimeInterceptor implements MethodInterceptor {
    private Object target;  
    public TimeInterceptor(Object target) {
        this.target = target;
    }
    @Override
    public Object intercept(Object proxy, Method method, 
            Object[] args, MethodProxy invocation) throws Throwable {
        System.out.println("方法之前:"+System.currentTimeMillis());
        Object ret = invocation.invoke(target, args); 
        System.out.println("方法之后:"+System.currentTimeMillis());
        
        return ret;
    }
}
ログイン後にコピー

intercept メソッドには 4 つのパラメータがあります。 1. 生成されたプロキシ クラス インスタンス。 2. プロキシ オブジェクトのメソッドによって参照されます。 3. メソッドパラメータ値の配列。 4. プロキシ クラスのメソッドへのプロキシ参照。

public class ProxyUtil {
    @SuppressWarnings("unchecked")
    public static <T> T proxyOne(Class<?> clz,MethodInterceptor interceptor){
        return (T)Enhancer.create(clz, interceptor);
    }
    }
ログイン後にコピー

Enhancer クラスは、CGLib のバイトコード エンハンサーです。

public class UserManage {
    public void addUser(String userId, String userName) {
        System.out.println("addUser(id:"+userId+",name:"+userName+")");
    }
}
public static void main(String[] args) {
        UserManage um = new UserManage();
        TimeInterceptor time = new TimeInterceptor(um);
        um = ProxyUtil.proxyOne(um.getClass(), time);
        um.addUser("111", "老王");
    }
ログイン後にコピー

関連する無料学習の推奨事項:

Java 基本チュートリアル

以上がSpring AOPの原理とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート