春の AOP 原則: 1. AOP はアスペクト指向であり、オブジェクト指向プログラミング OOP を改善するためにプログラム構造を検討するための別の視点を提供するプログラミング パラダイムです。2. AOP は、開発者に水平メカニズムの説明を提供します。横断的な関心事と、横断的な関心事をオブジェクト指向ソフトウェア システムに自動的に組み込むことができます。
spring aop 原則:
AOP (アスペクト指向) は、別の視点を提供するプログラミング パラダイムです。検討してみてください。オブジェクト指向プログラミング (OOP) を補完するプログラム構造。
AOP は、開発者に横断的な懸念事項を記述するメカニズムを提供し、横断的な懸念事項をオブジェクト指向ソフトウェア システムに自動的に組み込むことができるため、横断的な懸念事項のモジュール化を実現します。
AOP は、ビジネスとは関係がないものの、トランザクション処理、ログ管理、権限制御などのビジネス モジュールによって一般的に呼び出されるロジックや責任をカプセル化して、重複コードの削減を促進します。システムを統合してモジュール数を削減し、結合度を高めることで将来の運用性や保守性を向上させます。
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", "老王"); }
関連する無料学習の推奨事項:
以上がSpring AOPの原理とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。