spring中用到的代理方式,动态代理详解,aop中的动态代理运行方式。

1.为什么要用代理模式
总结:在ioc中,代理方式可以解除已有类和类之间依赖的关系;aop中,已有类的一些通用方法,如打印日志,处理事务等,可以用aop增强类,代理的方式,统一处理,减轻代码量,和更方便管理。

三种代理,静态代理,和两种动态代理。

静态代理

接口A,实现类B,代理类C(实现接口A,注入实现类B的对象
)
总结:所谓的静态代理,理解的意思是代理某个类。
特点:实现简单;理解容易
缺点明显:1)只能代理某一个类。当目标类增加了,代理类可能也需要成倍的增加,代理类数量过多。2)当你的接口修改了,会影响众多实现类,厂家类,代理都需要修改,影响很大。

两种动态代理

底层原理:是基于反射机制创建代理类的对象。不需要创建类文件。

1、jdk代理:

理解:使用Java反射包中的类和接口实现功能。反射包:java.lang.reflect,里面有三个类:invocationHandler,Method,Proxy.
java动态代理利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。俗称jdk代理。
视频参考:https://www.bilibili.com/video/BV1HZ4y1p7F1?p=10&spm_id_from=pageDriver

实现:写接口A,目标实现类B(实现接口A),代理类B(实现InvocationHandler,重写invoke方法,加入自己的逻辑),在main函数中,借助java.lang.reflect 中的代理类proxy的方法.Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(), cr)
完成代理对象的生成。
总结:基于静态代理的逻辑,运用了java.lang.reflect包中的Proxy类去生成代理类,包中的Method类,传入对象,和方法名,得到代理方法;实现invokeationhandler接口,接口中唯一 的方法invoke,在里面传入目标方法,和其他代码(增加功能的)
https://www.bilibili.com/video/BV1HZ4y1p7F1?p=11
缺点:目标类一定是有接口的

在这里插入图片描述

Proxy.newProxyInstance(a.getClass().getClassLoader(), a.getClass().getInterfaces(), cr)
三个入参解析,一般传递的是:目标类(被代理类)加载器,类的接口,新建的动态代理类对象(因为它实现了invocationHandler接口,主要看重的是是它重写的方法里的逻辑)
动态代理实现的代码
**

2、cglib动态代理:

原理:cglib是第三方的工具库,创建代理对象。原理是继承,cglib通过继承目标类,创建他的子类,在子类中重写父类中同名的方法,实现功能的修改。
缺点:要求目标不是final的,方法不是final的。

aop中动态代理的实现

利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 spring中的动态代理 spring会自动在JDK动态代理和CGLIB之间转换1、 默认使用Java动态代理 来创建AOP代理,这样就可以为任何接口实例创建代理了。2、当需要代理的类没有实现代理接口的时候,Spring会切换为使用CGLIB代理。3、可以通过配置 强制使用CGLIB实现AOP ,配置方法为:(1)添加CGLIB库,SPRING_HOME/cglib/*.jar(2)在spring配置文件里面"proxy-target-class"属性设置为true 两种动态代理的区别1、实现方式(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法因为是继承,所以该类或方法不要声明成final2、性能差别(1)使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类, 比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。(2)在对JDK动态代理与CGlib动态代理的代码实验中看,1W次执行下,JDK7及8的动态代理性能比CGlib要好20%左右。
总结:优先选择jdk代理,如果没有接口选择cglib代理。

#####################################附加文章
重写打断方法
intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3)
具体实现:通过cglib的类Enhancer,传入入参:要代理的目标类,实现methodinterceptor接口的实现类,实现动态代理。
详细解释cglib动态代理类
有用的文章

简介:
Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象。
简化:
代理的优势

三种代理的总结:
用途局限上 ,静态代理(只能应用于单个类)< jdk自带的动态代理,依赖于Proxy类(需要目标类有接口)<cglib(创建代理类继承 MethodInterceptor ,即可)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值