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
Cglibエージェント工場:ProxyFactory.java
テストクラス:
SpringのAOPプログラミングでは、コンテナに入ったターゲットオブジェクトに実装インタフェースがある場合、JDKエージェントでターゲットオブジェクトに実装インタフェースがない場合、Cglibエージェントで
学習交流群569772982に参加することを歓迎して、みんなはいっしょに交流を学びます.
上記の静的エージェントと動的エージェントモードは、ターゲットオブジェクトがインタフェースを実装するターゲットオブジェクトであることを要求しているが、ターゲットオブジェクトが単独のオブジェクトであり、インタフェースが実装されていない場合がある.この場合、ターゲットオブジェクトのサブクラスでクラス実装エージェントを使用することができる.この方法は、CglibエージェントCglibエージェント、サブクラスエージェントとも呼ばれる.メモリにサブクラスオブジェクトを構築する、ターゲットオブジェクトの機能拡張を実現する.
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に参加することを歓迎して、みんなはいっしょに交流を学びます.