这是有意义的一天!自己研究一路畅通的感觉真爽

原理是参考大神的,代码手敲

一、原理区别:

java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

如何强制使用CGLIB实现AOP?
 (1)添加CGLIB库,SPRING_HOME/cglib/*.jar
 (2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

JDK动态代理和CGLIB字节码生成的区别?
 (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
 (2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
   因为是继承,所以该类或方法最好不要声明成final

二、代码实现

用户管理接口

package com.lf.shejimoshi.proxy.entity;
//用户管理接口
public interface UserManager {//新增用户抽象方法void addUser(String userName,String password);//删除用户抽象方法void delUser(String userName);}

用户管理接口实现类

package com.lf.shejimoshi.proxy.entity;
//用户管理实现类,实现用户管理接口
public class UserManagerImpl implements UserManager{//重写新增用户方法
    @Overridepublic void addUser(String userName, String password) {System.out.println("调用了新增的方法!");System.out.println("传入参数为 userName: "+userName+" password: "+password);}//重写删除用户方法
    @Overridepublic void delUser(String userName) {System.out.println("调用了删除的方法!");System.out.println("传入参数为 userName: "+userName);}}

JDK动态代理

package com.lf.shejimoshi.proxy.jdk;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;import com.lf.shejimoshi.proxy.entity.UserManager;
import com.lf.shejimoshi.proxy.entity.UserManagerImpl;
//JDK动态代理实现InvocationHandler接口
public class JdkProxy implements InvocationHandler {private Object target ;//需要代理的目标对象
    @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK动态代理,监听开始!");Object result = method.invoke(target, args);System.out.println("JDK动态代理,监听结束!");return result;}//定义获取代理对象方法private Object getJDKProxy(Object targetObject){//为目标对象target赋值this.target = targetObject;//JDK动态代理只能针对实现了接口的类进行代理,newProxyInstance 函数所需参数就可看出return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);}public static void main(String[] args) {JdkProxy jdkProxy = new JdkProxy();//实例化JDKProxy对象UserManager user = (UserManager) jdkProxy.getJDKProxy(new UserManagerImpl());//获取代理对象user.addUser("admin", "123123");//执行新增方法
    }}

JDK动态代理运行结果

Cglib动态代理(需要导入两个jar包,asm-5.2.jar,cglib-3.2.5.jar。版本自行选择)

package com.lf.shejimoshi.proxy.cglib;import java.lang.reflect.Method;import com.lf.shejimoshi.proxy.entity.UserManager;
import com.lf.shejimoshi.proxy.entity.UserManagerImpl;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;//Cglib动态代理,实现MethodInterceptor接口
public class CglibProxy implements MethodInterceptor {private Object target;//需要代理的目标对象//重写拦截方法
    @Overridepublic Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable {System.out.println("Cglib动态代理,监听开始!");Object invoke = method.invoke(target, arr);//方法执行,参数:target 目标对象 arr参数数组System.out.println("Cglib动态代理,监听结束!");return invoke;}//定义获取代理对象方法public Object getCglibProxy(Object objectTarget){//为目标对象target赋值this.target = objectTarget;Enhancer enhancer = new Enhancer();//设置父类,因为Cglib是针对指定的类生成一个子类,所以需要指定父类
        enhancer.setSuperclass(objectTarget.getClass());enhancer.setCallback(this);// 设置回调 Object result = enhancer.create();//创建并返回代理对象return result;}public static void main(String[] args) {CglibProxy cglib = new CglibProxy();//实例化CglibProxy对象UserManager user =  (UserManager) cglib.getCglibProxy(new UserManagerImpl());//获取代理对象user.delUser("admin");//执行删除方法
    }}

Cglib动态代理运行结果

有什么问题可以留言讨论!

转载于:https://www.cnblogs.com/leifei/p/8263448.html

Spring的两种动态代理:Jdk和Cglib 的区别和实现相关推荐

  1. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  2. 【Spring】Spring中AOP解析 上 两种动态代理方式与ProxyFactory代理工厂

    1.两种动态代理方式演示 1.1 JDK动态代理 JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程.要求被代理类必须实现一个接口 . 如下案 ...

  3. 动态代理proxy与CGLib的区别

    转载自 动态代理proxy与CGLib的区别 昨天被人问及动态代理与CGlib的区别,赶紧回顾一下: 什么是代理? 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib ...

  4. Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB)

    代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理.如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理:如果目标对象没有实现任何接口,则会 ...

  5. 动态代理jdk和cglib区别、注意事项(private,static,final)、spring aop原理

    文章目录 一.代理简聊 二.静态代理 三.动态代理 1.jdk动态代理 2.cglib动态代理 四.动态代理总结.注意事项 1.jdk动态代理与cglib的区别. 2.注意事项及分析. 五.aop原理 ...

  6. Java中三种代理方式—— 静态代理与两种动态代理的实现机制

    个人博客请访问 http://www.x0100.top 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现 ...

  7. 使用 cglib_java动态代理(JDK和CGLIB原理解析与使用)

    CGLIB的动态代理 原理 代理为控制要访问的目标对象提供了一种途径.当访问对象时,它引入了一个间接的层.JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理.JDK的动态代理用起 ...

  8. 动态代理JDK于cglib

    静态代理的缺点: 1.由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类 2.如果一个Service中有很多方法需要事务(增强动作), ...

  9. java动态代理(JDK和cglib)详解

    JAVA的动态代理  代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委 ...

最新文章

  1. win10添加新用户
  2. 金融行业容器平台落地路径:敏捷响应业务更迭
  3. 【工作分解法】IT人,你的工作“轻松”么?
  4. 第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【6】
  5. 直播预告│据说这是人工智能领域里最难的一门学问……
  6. [精品]CSAPP Bomb Lab 解题报告(六)
  7. 无线运维——J2ME和WAP运维方式的优缺点
  8. 任务计划命令 linux,linux执行一次性任务计划at命令
  9. 后来朋友选了伪原创工具下载这个词
  10. Makefile模板的继续改进
  11. Elasticsearch安装-源码
  12. Proteus 8.6软件安装教程
  13. igh+preempt_rt主战搭建
  14. 60条有名的原则与定理
  15. msfvenom生成木马的简单利用
  16. 在chrome中设置禁止访问的网站
  17. 阿里云服务器,解析二级域名
  18. zbb20180930 设计模式-单例模式
  19. C#:Krypton控件使用方法详解(第十六讲) ——kryptonCheckedListBox
  20. 工作 3 年后的一些思考

热门文章

  1. SAP CRM WebClient UI cross component跳转中有一个硬编码的CROSSNAV
  2. 阿里云上到底能运行SAP哪些产品?
  3. micropython esp8266教程_ESP8266 快速开发指南
  4. consul php,go-micro+php+consul实现简单的微服务
  5. php mysql第4版高清_PHP和MySQL WEB开发(中文高清第4版)
  6. exit java_没有System.exit,如何退出Java程序?(通过用户输入?)
  7. centos7下安装低版本mysql_centos7下使用yum安装制定版本mysql
  8. python tkinter画布位置_Python Tkinter坐标画布
  9. 调用视频流html代码,如何将/“流”视频文件发送到HTML5视频标签
  10. 节约里程法java代码_患者,男,70岁,有多年排尿困难,呈淋漓状,近2年来双侧腹股沟区出现半年圆形肿块,站立时明显,平卧后消失,体检时压迫内环肿块仍出现,诊断为...