[align=center][size=large][b]动态代理[/b][/size][/align]
[b]1、动态代理执行过程[/b]
代理对象执行一个方法的时候,会调用注入的InvocationHandler的invoke()方法,invoke()方法执行的过程中,会调用被代理对象与代理对象相同的方法,同时还会调用Advice的相关方法。
[img]http://dl2.iteye.com/upload/attachment/0088/8833/e6b81321-99a6-3df9-b2d3-dc50d314c869.png[/img]
[b]2、模拟Spring的事务[/b]
1)建议接口
2)具体建议类
3)代理工厂
4)测试类
[b]1、动态代理执行过程[/b]
代理对象执行一个方法的时候,会调用注入的InvocationHandler的invoke()方法,invoke()方法执行的过程中,会调用被代理对象与代理对象相同的方法,同时还会调用Advice的相关方法。
[img]http://dl2.iteye.com/upload/attachment/0088/8833/e6b81321-99a6-3df9-b2d3-dc50d314c869.png[/img]
[b]2、模拟Spring的事务[/b]
1)建议接口
import java.lang.reflect.Method;
public interface Advice {
void beforeMethod();
void afterMethod(Method method);
}
2)具体建议类
import java.lang.reflect.Method;
public class MyAdvice implements Advice {
@Override
public void beforeMethod() {
System.out.println("before Method ...");
}
@Override
public void afterMethod(Method method) {
System.out.println("---------- Method Name : " + method.getName()
+ " ----------");
System.out.println("after Method ...");
}
}
3)代理工厂
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
/**作用:获取目标类的代理对象 (注释部分为原先代码)
* @author **
* @param target 真正执行方法的类,也就是目标类
* @param advice 代理对象的执行策略,策略不同,执行效果也不同
* @return 返回一个目标类的代理对象
*/
public static Object getProxy(final Object target , final Advice advice) {
Object clazzProxy = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
/*new Class[]{Collection.class},*/
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
/*System.out.println("before Method ...");
Object returnValue = method.invoke(target, args);
System.out.println("---------- Method Name : "
+ method.getName() + " ----------");
System.out.println("after Method ...");*/
advice.beforeMethod();
Object returnValue = method.invoke(target, args);
advice.afterMethod(method);
return returnValue;
}
});
return clazzProxy;
}
}
4)测试类
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class SpringTest {
public static void main(String[] args) {
// 要被代理的对象,即目标类
List<String> target = new ArrayList<String>();
// 获取目标类的代理对象
Collection<String> clazzProxy =
(Collection<String>) ProxyFactory.getProxy(target , new MyAdvice());
// 使用代理对象执行方法
clazzProxy.add("a");
clazzProxy.add("b");
clazzProxy.add("c");
System.out.println(clazzProxy.size());
}
}