cglibダイナミックエージェントとjdkダイナミックエージェント


一、動的代理
はっきり言って、動的にクラスを作成して、この中で自分の書いたクラスを引用して、すべての方法の呼び出しはすべて先のエージェントクラスのオブジェクトで、それはいくつかのコードの上の強化を担当して、更にあなたの書いたクラスを呼び出します.
二、jdkダイナミックエージェントとcglibダイナミックエージェントの違い
例えば、クラスと彼らの方法に断面を作って、これらのクラスの方法で強化するコードを定義して、springは必然的にそれらのクラスに対して動的エージェントを生成して、動的エージェントの中で定義した強化コードを実行します;
クラスが実装クラスのインタフェースである場合、SpringAOPはjdkダイナミックエージェントを使用して、あなたと同じインタフェースを実装するエージェントクラスを生成し、インスタンスオブジェクトを構築します.もしあなたのクラスがインタフェースを実現していないならば、SpringAOPはcglibを変えて動的エージェントを生成して、あなたのクラスの1つのサブクラスを生成して、あなたのいくつかの方法をカバーして、方法の中で強化のコードを加えます;
三、jdkダイナミックエージェントのコード例
[参照元]https://www.cnblogs.com/muscleape/p/9018302.html
ビジネスインタフェース実装クラスのオブジェクトを持つServiceInvocationHandlerを定義します.getProxy()メソッドを使用して、同じインタフェースを継承する動的エージェントクラスのインスタンスオブジェクトを作成します.動的エージェントクラスの拡張メソッドを使用すると、invokeメソッドに移動します.
/**
 *        
 * 
 * @author Muscleape
 *
 */
public class UserServiceImpl implements UserService {

	@Override
	public void addUser() {
		System.out.println("      。。。");
	}

	@Override
	public void editUser() {
		System.out.println("      。。。");
	}

}

/**
 *   InvocationHandler   handler   
 * 
 * @author Muscleape
 *
 */
public class ServiceInvocationHandler implements InvocationHandler {

	/**
	 *     
	 */
	private Object target;

	/**
	 *     
	 * 
	 * @param target
	 */
	public ServiceInvocationHandler(Object target) {
		super();
		this.target = target;
	}

	/**
	 *   InvocationHandler     
	 * 
	 *          ,     
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

		Object result = null;
		System.out.println("     ,    。。。");
		System.out.println("    。。。");
		//         
		result = method.invoke(target, args);
		System.out.println("    。。。");
		return result;
	}

	/**
	 *       
	 * 
	 * @return
	 * @throws Throwable
	 */
	public Object getProxy() throws Throwable {
		return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
				this.target.getClass().getInterfaces(), this);
		//            ,        
		// return null;
	}

}

四、cglibダイナミックエージェントのコード例
[参照元]https://www.cnblogs.com/muscleape/p/9018308.html
ビジネスインタフェース実装クラスのオブジェクトを持つUserServiceCglibを定義します.動的エージェントクラスのインスタンスオブジェクトをgetInstance(Object target)メソッドで作成します.動的エージェントクラスの拡張メソッドを使用すると、interceptメソッドに移動します.
/**
 *    
 * 
 *       
 * 
 *     final ,         ,  
 * 
 *      final ,    
 * 
 * @author Muscleape
 *
 */
public class UserServiceImpl {
	public void addUser() {
		System.out.println("      。。。");
	}

	public void editUser() {
		System.out.println("      。。。");
	}
}

/**
 * cglib   ,      MethodInterceptor
 * 
 * @author Muscleape
 *
 */
public class UserServiceCglib implements MethodInterceptor {

	private Object target;

	public Object getInstance(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		//       
		enhancer.setCallback(this);
		//       
		return enhancer.create();
	}

	/**
	 *   MethodInterceptor        
	 * 
	 *     
	 */
	@Override
	public Object intercept(Object object, Method method, Object[] args, 		  MethodProxy proxy) throws Throwable {
		System.out.println("    。。。");
		Object result = proxy.invokeSuper(object, args);
		System.out.println("    。。。");
		return result;
	}

}