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