SSM(六)JDK动态代理和Cglib动态代理
2024-09-01 01:38:52
1.Cglib动态代理
目标类:
package cn.happy.proxy.cglib; public class Service {
public Service() {
System.out.println("创建Service对象");
} public void doWordk(){
System.out.println("do something");
}
}
测试:
package cn.happy.proxy.cglib; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibTest {
public static void main(String[] args) {
//对方法增强。开闭原则-对修改关闭,对添加放开
//1.创建一个目标对象
Service service=new Service();
//2.Enhancer对象
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(service.getClass());
//3.调度setCallBack()
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("write log");
methodProxy.invoke(service,objects);
return null;
}
});
//4.Enhancer对象的Create()方法创建代理
Service proxy =(Service) enhancer.create();
//5.执行代理方法
proxy.doWordk();
}
}
测试结果:
测试第27行enhancer.create()方法调用了Service的构造器。
create()方法是生成代理对象,其本质是目标类的子类实例,所以会调用父类构造。
2.JDK动态代理
jdk动态代理原理是动态生成目标对象实现接口的实现类。
接口:
package cn.happy.proxy.jdk; public interface IService {
public void doWordk();
}
目标类:
package cn.happy.proxy.jdk; public class ServiceImpl implements IService{
public ServiceImpl() {
System.out.println("创建Service对象");
}
@Override
public void doWordk(){
System.out.println("do something");
}
}
测试:
package cn.happy.proxy.jdk; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class JdkTest {
public static void main(String[] args) {
ServiceImpl service = new ServiceImpl();
IService proxy = (IService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("write log");
method.invoke(service, args);
return null;
}
});
proxy.doWordk();
}
}
测试结果:
3.比较
这里从网上摘了点儿东西
JDK动态代理:代理类和目标类必须实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理。
CGLIB动态代理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。
最新文章
- TestNG 与 Junit的比较
- SharePoint 2016 图文安装教程
- js实现图片加载特效(从左到右,百叶窗,从中间到两边)
- poj 2060 Taxi Cab Scheme (二分匹配)
- Dijkstra 算法、Kruskal 算法、Prim算法、floyd算法
- 剑指offer系列32-----对称二叉树的判断
- 奇异秀App:奇异秀秀奇异,用大头视频来拜年
- .NET Core跨平台开发
- ASPNET异步删除和增加
- Task和backStack(本篇章核心)
- Thrift序列化与反序列化的实现机制分析
- Why choose Nexiq USB-link 125032 Diesel Truck Diagnose
- Java马士兵高并发编程视频学习笔记(二)
- js静态方法与实例方法定义,js回调方法定义
- U3D外包公司:Ruby的未来
- 【python】参数中的*args和**kwargs
- Android中用文件初始化sqlite 数据库(二)
- How to view assertions in the Verdi waveform viewer
- 3月26 document的练习
- learning shell display alert function
热门文章
- Theano 编程核心
- Windows Presentation Foundation (WPF)中的命令(Commands)简述
- WPF XAML中 Storyboard.TargetProperty设置TransformGroup指定的变换";RenderTransform.Children
- NS2网络模拟(6)-homework02.tcl
- vc有关 directx组态,和dxsdk_extras(directshow)
- WPF之VLC流媒体播放
- Android 位置服务——BaiduLocation的使用
- .NET Framework 源代码
- StackLayout
- jquery 复选框操作-prop()的使用