Java 代理设计模式
为其他对象提供一种代理以控制对这个对象的访问。代理对象起到中介作用,可去掉功能服务或增加额外的服务
1、静态代理
在静态代理模式之下,我们显示地创建代理类,代理类持有被代理类的对象,实现与被代理类 的相同接口,并且增添相应的业务逻辑,以达到代理的效果
代理和被代理对象在代理之前是确定的,他们都实现相同的接口或者继承相同的抽象类
如何实现:创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法
/**
* 服务接口
*/
public interface Service {
/**
* 服务
*/
void doService(String name);
}
/**
* 服务员(被代理对象,下面称为目标对象)
*/
public class Waiter implements Service{
2、动态代理(重点)
2.1、jdk动态代理
利用反射机制在运行时创建代理类,代理对象必须实现某个接口
jdk动态代理具体步骤:
-
通过实现 InvocationHandler 接口创建自己的调用处理器;
-
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
-
通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
-
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。
/**
* 服务接口
*/
public interface Service {
/**
* 服务
*/
void doService(String name);
}
/**
* 服务员(被代理对象,下面称为目标对象)
*/
public class Waiter implements Service {
/**
* 服务
* @param name
*/
参考资料:https://www.jianshu.com/p/9bcac608c714
2.2、cglib动态代理
通过cglib的动态代理它能够针对实现没有接口的目标类,进行动态代理
注意:要手动加载cglib的库文件
-
实现原理
-
/**
* 服务员(被代理对象,下面称为目标对象)
*/
public class Waiter {
/**
* 服务
*/
public void doService(){
System.out.println("正在服务");
}
}
/**
* 代理目标对象类
*/
public class MyMethodInterceptor implements MethodInterceptor {
/**
* 处理主体:编写代理的逻辑代码增强
* 参数一: 0: 目标对象的引用
* 参数二: method:目标对象调用的方法
* 参数三: args: 目标对象的方法的参数
* 参数四:当前执行方法的代理对象
* 返回值:目标方法的返回值
*/
参考资料:
记得快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!