cglib动态代理商
概念及特点
- 使用CGLib实现动态代理商,依赖cglib-x.x.x.jar
- 原理是对指定的业务类动态生成一个子类,并覆盖其中业务方法实现代理商
- 针对类来实现代理商的,完全不受代理商类必需实现接口的限制
- CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理商类
- 由于采用的是继承,所以不能对final修饰的类进行代理商,不能对公告为final的方法进行代理商
组成
- 业务实现类 负责实现主要的业务方法(不需要实现接口)
- 实现阻拦接口MethodInterceptor,创立动态代理商类
案例演示
引入cglib
<dependencies> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> </dependencies>
业务实现类
public class AccountServiceImpl { public void queryAccount() { System.out.println("查看账户..."); } public void updateAccount() { System.out.println("修改账户..."); }}
方法阻拦器
public class CglibProxy implements MethodInterceptor { private Object target;//业务类对象,供代理商方法中进行真正的业务方法调用 //相当于JDK动态代理商中的绑定 public Object getInstance(Object target) { this.target = target; //给业务对象赋值 Enhancer enhancer = new Enhancer(); //创立增强器,用来创立动态代理商类 enhancer.setSuperclass(this.target.getClass()); //为增强器指定要代理商的业务类(即:为下面生成的代理商类指定父类) //设置回调:对于代理商类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行阻拦 enhancer.setCallback(this); // 创立动态代理商类对象并返回 return enhancer.create(); } // 实现回调方法 @Override public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("预解决——————"); proxy.invokeSuper(target, args); //调用业务类(父类中)的方法 System.out.println("调用后操作——————"); return null; }}
- 业务调用
public class CglibProxyApplication { public static void main(String[] args) { AccountServiceImpl accountServiceImpl=new AccountServiceImpl(); CglibProxy cglib=new CglibProxy(); AccountServiceImpl accountServiceProxy=(AccountServiceImpl)cglib.getInstance(accountServiceImpl); accountServiceProxy.queryAccount(); accountServiceProxy.updateAccount(); } }
两种动态代理商比照
- 机制区别
- jdk动态代理商是通过接口中的方法名,在动态生成的代理商类中调用业务实现类的同名方法;利用阻拦器(阻拦器必需实现InvocationHanlder)加上反射机制生成一个实现代理商接口的匿名类;
- cglib动态代理商是通过继承业务类,生成的动态代理商类是业务类的子类,通过重写业务方法进行代理商;cglib底层采用ASM字节码生成框架,使用字节码技术生成代理商类;
- 效率比照
- jdk6之前,cglib效率过于jdk反射
- 调用次数较少时,jdk6、jdk7优于cglib
- 调用次数较多时,jdk6、jdk7反射效率低于cglib
- jdk8 动态代理商优于cglib效率
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » cglib动态代理商
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » cglib动态代理商