代理模式(静态): 一个接口,两个实现类A(代理类)和B(业务类),A类持有B类,这两个类方法相同,那么A类方法内部调用B类的方法,就可以在B类核心业务前后进行前置处理、后置处理,异常环绕处理等等。
Jdk动态代理要求必须有接口I和实现类B(业务类),那么通过jdk动态代理生成的类就是类A(代理类),上面代理模式是静态代理,这里就是动态代理,代码运行时候会生成一个代理类。
Cglib动态代理不要求有接口I只需要一个核心业务类B,那么通过cglib动态代理生成的类就是类A(代理类), 同上。
JDK动态代理示例:
public static void main(String[] args) {
//核心业务类B
IBooService B = new BooServiceImpl();
//生成的代理类A
Object A = Proxy.newProxyInstance(IBooService.class.getClassLoader(), new Class[]{IBooService.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理类方法的通用处理逻辑
System.out.println("开始事物");
//调用核心业务类B的方法
ReflectionUtils.invokeMethod(method, B, args);
System.out.println("提交事物");
return method.getName();
}
});
//调用代理类A方法
IBooService bs = (IBooService)A;
bs.check();
}
输出结果:
开始事物
2018-08-16 10:30:44.161 [main] INFO com.tx.test.service.impl.BooServiceImpl - check()
提交事物
Cglib动态代理示例:
Enhancer enhancer = new Enhancer();
//设置业务类B
enhancer.setSuperclass(FooServiceImpl.class);
//设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Long bTime = System.currentTimeMillis();
System.out.println("开始毫秒:"+ bTime);
//调用业务类B方法
proxy.invokeSuper(object, args);
Long eTime = System.currentTimeMillis();
System.out.println("结束毫秒:"+ bTime);
Long mills = eTime - bTime;
System.out.println("毫秒:"+ mills);
return mills;
}
});
//生成代理类A
Object A = enhancer.create();
IFooService fs1 = (FooServiceImpl) A;
//调用代理A方法
fs1.check();
运行结果:
开始毫秒:1534387476396
2018-08-16 10:44:36.403 [main] INFO com.tx.test.service.impl.FooServiceImpl - check()
结束毫秒:1534387476396
毫秒:7
完!
posted on 2018-08-16 10:46
朔望魔刃 阅读(194)
评论(0) 编辑 收藏 所属分类:
java