目录
1.代理模式
2.静态代理
2.1 通过继承实现静态代理
2.2 通过组合实现静态代理
3.动态代理
3.1 JDK动态代理
3.2 cglib动态代理
3.3 SpringAOP使用以及原理
4.原理理解
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
这段话引用至该文章
简单来说代理模式就是将被代理类包装起来然后重新实现相同的方法,并且调用原来方法的同时可以在方法前后添加一个新的处理。而这种包装可以使用继承或者组合来使用。当我们调用的时候需要使用的是代理类的对象来调用而不是原来的被代理对象。
静态代理有两种实现方式:
- 通过继承实现
- 通过组合实现
通过继承被代理对象,重写被代理方法,可以对其进行代理。
优点:被代理类无需实现接口
缺点:只能代理这个类,要想代理其他类,要想代理其他类需要写新的代理方法。
cglib动态代理就是采用这种方式对类进行代理。不过类是由帮我们在内存中动态生成的。
定义一个 接口被代理类需要和代理类都需要实现该接口。(接口在这里的目的就是起一个规范作用保证被代理类和代理类都实现了方法)。代理类需要将该接口作为属性,实例化时需要传入该接口的对象,这样该代理类就可以实现代理所有实现的类了。
优点:可以代理所有实现接口的类。
缺点:被代理的类必须实现接口。
JDK动态代理就是采用的这种方式实现的。同样的代理类是由JDK自动帮我们在内存生成的。
动态代理其实本质还是 将被代理类包装一层,生成一个具有新的相同功能的代理类。
但是与静态代理不同的是,这个代理类我们自己定义的。而动态代理这个代理类是根据我们的提示动态生成的。
相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
实现动态代理有几种方案:
- JDK动态代理
- CGLIB动态代理
- SpringAop
通过java提供的类帮我们创建代理对象。
优点:可以生成所有实现接口的代理对象
缺点:JDK反射生成代理必须面向接口, 这是由Proxy的内部实现决定的。生成代理的方法中你必须指定实现类的接口,它根据这个接口来实现代理类生成的所实现的接口。
CGLib(Code Generate Library) 与JDK动态代理不同的是,cglib生成代理是被代理对象的子类。因此它拥有继承方法实现静态代理的优点:不需要被代理对象实现某个接口。
缺点:不能给类生成代理,因为类无法拥有子类。
使用生成代理类也很简单,只要指定父类和回调方法即可
首先需要引入依赖
jdk动态代理Proxy原理。
Proxy.newProxyInstance 根据用户传进来的参数调用 来生成这个代理类。并返回一个实现了接口的代理类,用户实际调用时是调用的代理类的方法。
扩展:提供了一套API,java可以通过它来直接操控内存中的字节码文件即。有人说因为有了反射java成了动态语言可以操控class文件,但其实java是因为有了ASM才可以真正算得上动态语言!因为反射只能拿到类的内部信息和执行,但是ASM可以直接在内存中修改class文件。

为了看清Proxy代理到底帮我们生成了什么,可以执行下面这段代码
执行成功之后会自动生成一个这个文件

代码没有仔细研究,不过还是可以很明显的看到生成的这个类实现了方法
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/11798.html