Cglibベースの動的エージェント
JDKはインタフェースに基づいてのみ動的エージェントを行うため、SpringはJDKとCglibを組み合わせて動的エージェントを生成し、Cglibはクラスの動的エージェントを行うことができる
簡単な動的エージェントの例を次に示します.
エージェントされたクラス
ブロッキングと同様のブロッキング方法
エージェントオブジェクトの実装
テストプログラム
簡単な動的エージェントの例を次に示します.
エージェントされたクラス
package com.lbx.dog;
public class Dog {
public void info() {
// TODO Auto-generated method stub
System.out.println(" ");
}
public void run() {
// TODO Auto-generated method stub
System.out.println(" RUN");
}
}
ブロッキングと同様のブロッキング方法
package com.lbx.proxy;
public class DogInterceptor {
public void method1(){
System.out.println(" ");
}
public void method2(){
System.out.println(" ");
}
}
エージェントオブジェクトの実装
package com.lbx.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
DogInterceptor di = new DogInterceptor();
public CglibProxy(){
}
public Object getProxy(Class c){
enhancer.setSuperclass(c);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
di.method1();
Object result = proxy.invokeSuper(obj, args);
di.method2();
return result;
}
}
テストプログラム
package com.lbx.test;
import com.lbx.dog.Dog;
import com.lbx.proxy.CglibProxy;
public class Test {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
Dog proxyDog = (Dog)proxy.getProxy(Dog.class);
proxyDog.info();
proxyDog.run();
}
}