JDKダイナミックエージェントとCglibダイナミックエージェント
3321 ワード
Spring AOPは2つの代理機構を使用しています.一つはJDKに基づく動的エージェントです.もう一つはCGibに基づく動的エージェントです.
JDKダイナミックエージェントはインターフェースの代理しか提供できません.クラスの代理は実現できません.
だからSpring AOPもCglibダイナミックエージェント技術を採用しています.
JDKダイナミックエージェントとCGlibの違いについては、以下の例で説明します.
JDKダイナミックエージェント:
1、
業務インターフェースと実現類:
Proxy:業務実体の対象を生成し、代理類を生成する
InvocationHandler:横断コードと業務コードを結合するために使用されます.
2、
InvocationHanlderインターフェースを実現します.
CGlibダイナミックエージェント
CGlibは非常に低いバイトコード技術を採用しており、1つのクラスのためにサブクラスを作成し、サブクラスの中で方法でブロックする技術を採用して、すべての親方法の呼び出しを遮断することができます.
MethodInterceptorを実現する:動的エージェントクラスを作成し、業務方法コードと横断論理コードを組み合わせます.
JDKダイナミックエージェントはインターフェースの代理しか提供できません.クラスの代理は実現できません.
だからSpring AOPもCglibダイナミックエージェント技術を採用しています.
JDKダイナミックエージェントとCGlibの違いについては、以下の例で説明します.
JDKダイナミックエージェント:
1、
業務インターフェースと実現類:
public interface BusinessService {
void ink_print();
}
public class BusinessServiceImpl implements BusinessService {
@Override
public void ink_print() {
System.out.println("--------------- ----------------");
}
}
JDKダイナミックエージェントは、2つのProxyとInvocationHandlerに関連しています.Proxy:業務実体の対象を生成し、代理類を生成する
InvocationHandler:横断コードと業務コードを結合するために使用されます.
2、
InvocationHanlderインターフェースを実現します.
public class JdkHandler implements InvocationHandler {
private Object target;
public JdkHandler(Object target){
this.target = target;
}
/**
*
* ①System.out.println("--------------- AOP----------------");
* ②System.out.println("--------------- ----------------");
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//
System.out.println("--------------- AOP----------------");
// ,method.invoke
Object obj = method.invoke(target, args);
return obj;
}
}
3、プロキシのインスタンスを作成するpublic class TestJdkProxy {
public static void main(String[] args) {
BusinessService target = new BusinessServiceImpl();
JdkHandler handler = new JdkHandler(target);
// target、handler
BusinessService proxy = (BusinessService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
proxy.ink_print();
}
}
メイン業務のメソッド体を呼び出して、Proxyを通じてプロキシ類を生成し、最終的にプロキシ類によって操作を実行します.これがプロキシ操作です.CGlibダイナミックエージェント
CGlibは非常に低いバイトコード技術を採用しており、1つのクラスのためにサブクラスを作成し、サブクラスの中で方法でブロックする技術を採用して、すべての親方法の呼び出しを遮断することができます.
MethodInterceptorを実現する:動的エージェントクラスを作成し、業務方法コードと横断論理コードを組み合わせます.
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method arg1, Object[] arg2,
MethodProxy proxy) throws Throwable {
System.out.println("--------------- AOP----------------");
Object target = proxy.invokeSuper(obj, arg2);
return target;
}
}
テストクラス:この時はJDKダイナミックエージェントと違って、インターフェースではなく、クラスエージェントを作成します.public class TestCglibProxy {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
BusinessServiceImpl businessService = (BusinessServiceImpl) proxy.getProxy(BusinessServiceImpl.class);
businessService.ink_print();
}
}