Spring代理设计模式

117 阅读2分钟

概念:将核心功能与辅助功能(事务、日志、性能监控代码分离),达到核心业务功能更加纯粹、辅助功能可用(辅助功能:存在于多个类中,且都与具体业务无关)

image.png

静态代理设计模式:通过代理类的对象,为原始类的对象(目标类的对象)添加辅助功能,更容易代理实现类,易于维护,将重复的,与业务无关的方法剥离出来实现一个代理类,通过代理对象调用业务对象实现核心功能,但辅助功能在代理类中实现。

image.png

静态代理类:这个类是我要明确写出来的类
【1】代理类要与原始业务类功能一致,只需要实现相同的接口即可
【2】由于核心功能还是原始业务类负责。所以代理类还要持有一个原始业务类的引用
【3】代理类仍存在持有辅助功能,依然冗余,使用动态代理解决

image.png 动态代理:代理类不是我写的,在程序运行过程中,在内存中通过反射机制动态地生成出一个类来,供我解决原始业务类的问题,并且由于动态生成地代理类不在项目中,所以没有任何的类文件,也没有任何的维护成本,实现了使用代理又不用维护代理。
动态代理设计模式:动态创建代理类的对象,为原始类的对象添加辅助功能,主要有基于接口的动态代理,基于CGLIB动态代理。

JDK动态代理主要时通过继承同一套接口

image.png 创建动态代理类时需要一个类加载器classLoder当前类的类对象.getClassLoader()
Interface:为了让代理类和原始类具有相同的方法,目标类.getClass().getInterfaces()获得目标类的所有接口.
InvcationHandler:额外功能。

image.png

CGLIB动态代理,CGLIB并不属于JDK的API,需要导入JAR包,Spring已经内置了CGLIB的相关实现

image.png