JDKダイナミックエージェントとCglibダイナミックエージェント


Spring AOPは2つの代理機構を使用しています.一つはJDKに基づく動的エージェントです.もう一つはCGibに基づく動的エージェントです.
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();
	}

}