Javaの3つのエージェントモード

2553 ワード

Cglibエージェント
上記の静的エージェントと動的エージェントモードは、ターゲットオブジェクトがインタフェースを実装するターゲットオブジェクトであることを要求しているが、ターゲットオブジェクトが単独のオブジェクトであり、インタフェースが実装されていない場合がある.この場合、ターゲットオブジェクトのサブクラスでクラス実装エージェントを使用することができる.この方法は、CglibエージェントCglibエージェント、サブクラスエージェントとも呼ばれる.メモリにサブクラスオブジェクトを構築する、ターゲットオブジェクトの機能拡張を実現する.
  • JDKの動的エージェントには、動的エージェントを使用するオブジェクトが1つ以上のインタフェースを実現する必要があるという制限がある、エージェントがインタフェースを実現していないクラスを実現するには、Cglibを使用して実現することができる.
  • Cglibは強力な高性能のコード生成パッケージであり、実行期間中にjavaクラスを拡張し、javaインタフェースを実現することができる.Spring AOPやsynaopのような多くのAOPのフレームワークで広く使用されており、彼らに方法を提供するinterception(ブロック)
  • Cglibパケットの下位層は、小さなブロックのバイトコード処理フレームASMを用いるバイトコードを変換して新しいクラスを生成する.JVMの内部構造にclassファイルを含むフォーマットとコマンドセットを熟知する必要があるため、ASMを直接使用することは奨励されません.

  • Cglibサブクラスエージェントの実装方法:
    1.cglibのjarファイルを導入する必要があるが、SpringのコアパッケージにはすでにCglib機能が含まれているため、pring-core-3.2を直接導入する.5.jarでよい.2.機能パッケージを導入すると、メモリ内でサブクラスを動的に構築することができる.エージェントのクラスはfinalではいけません.そうしないと、エラーが発生します.ターゲットオブジェクトのメソッドがfinal/staticである場合、ブロックされない、すなわちターゲットオブジェクトの追加のビジネスメソッドは実行されない.コード例:ターゲットオブジェクトクラス:UserDao.java
    /**
     *     ,        
     */
    public class UserDao {
    
        public void save() {
            System.out.println("----      !----");
        }
    }
    

    Cglibエージェント工場:ProxyFactory.java
    /**
     * Cglib      
     *  UserDao              
     */
    public class ProxyFactory implements MethodInterceptor{
        //      
        private Object target;
    
        public ProxyFactory(Object target) {
            this.target = target;
        }
    
        //             
        public Object getProxyInstance(){
            //1.   
            Enhancer en = new Enhancer();
            //2.    
            en.setSuperclass(target.getClass());
            //3.      
            en.setCallback(this);
            //4.    (    )
            return en.create();
    
        }
    
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("    ...");
    
            //         
            Object returnValue = method.invoke(target, args);
    
            System.out.println("    ...");
    
            return returnValue;
        }
    }
    

    テストクラス:
    /**
     *    
     */
    public class App {
    
        @Test
        public void test(){
            //    
            UserDao target = new UserDao();
    
            //    
            UserDao proxy = (UserDao)new ProxyFactory(target).getProxyInstance();
    
            //         
            proxy.save();
        }
    }
    

    SpringのAOPプログラミングでは、コンテナに入ったターゲットオブジェクトに実装インタフェースがある場合、JDKエージェントでターゲットオブジェクトに実装インタフェースがない場合、Cglibエージェントで
    学習交流群569772982に参加することを歓迎して、みんなはいっしょに交流を学びます.