当前位置: 首页 > article >正文

【Java】Java代理

目录

1. 引入

2. 代理

2.1  代理的目的:

2.2 代理的两种模式

1. 静态代理

$$1  定义:

 $$2 组成

$$3 实现步骤:

$$4  IDEA实现:

2. 动态代理

$$1  定义:

$$2  组成

 $$3  实现步骤:

 $$4  IDEA实现:


1. 引入

访问不到的东西交给别人去访问。

转账:

A--->B转账

这样一来,核心资源冗余。

在代理类中做风险隔离

2. 代理

2.1  代理的目的

        1.功能增强

                在不修改真实对象的情况下增加额外功能。比如权限验证、事务管理等。

                可以实现延迟加载,缓存优化等策略提升系统性能和资源利用率。

        2.控制访问

                限制对真实对象的直接访问,确保只有合适的用户或操作能够调用真实对象的方法,增强系统的安全性和可靠性,降低客户端和实际服务对象的耦合度。

2.2 代理的两种模式

CGLIB核心是继承,只有动态代理--->Mybatis

JDK核心是接口,有静态代理,也有动态代理

1. 静态代理

静态代理核心

        目标类,就有目标对象

代理

        由代理类控制着对目标对象的生成。

$$1  定义

        静态代理是一种设计模式,通过创建一个代理类来实现对目标对象的代理。代理类和目标类实现相同的接口,通过代理类来间接调用目标类的方法,从而实现功能的扩展。

 $$2 组成
  • 接口(Interface):定义了代理类和目标类需要实现的方法。
  • 目标类(Target Class):实现了接口的具体业务类。
  • 代理类(Proxy Class):实现了接口,并在内部持有目标类的实例,通过调用目标类的方法来实现代理功能。
$$3 实现步骤:
  • 定义接口。
  • 实现目标类。
  • 创建代理类。
  • 使用代理类。
$$4  IDEA实现

 定义接口:

public interface ZZ {
    public void zz(String A,String B,Double money);
}

实现目标类:

public class ZFB implements ZZ{

    @Override
    public void zz(String A, String B, Double money) {
        System.out.println("用户"+A+"给用户"+B+"转了"+money+"元");
    }
}

创建代理类:

public class APP implements ZZ{
    private ZFB zfb=new ZFB();
    @Override
    public void zz(String A, String B, Double money) {
        System.out.println("风险隔离");
        zfb.zz(A,B,money);
    }
}

使用代理类:

APP app=new APP();
        app.zz("张三","李四",100.0);

内存图:


2. 动态代理

静态代理易实现。

使用多态

$$1  定义:

        动态代理是在运行时动态生成代理类的实现。动态代理不需要事先知道目标类的具体实现,而是通过反射机制在运行时动态生成代理类。

$$2  组成
  • 动态代理类:在运行时动态生成,实现了被代理接口,并将方法调用转发给实际的被代理对象。
  • InvocationHandler接口:动态代理的核心接口,定义了代理类需要实现的方法,用于在代理对象的方法被调用时执行一些额外的逻辑。
 $$3  实现步骤:
  • 定义需要代理的接口。
  • 实现InvocationHandler接口,在invoke方法中实现对目标方法的增强或修改。
  • 使用Proxy类的newProxyInstance方法动态创建代理对象。
  • 调用代理对象的方法。
 $$4  IDEA实现

照着上面的,仿照写一个WX转账的。

1.代理目标类

多态

父类的引用指向子类的对象。

Object

2.实现接口,通过接口去实现核心方法

通过反射。

public class DTAPP implements InvocationHandler {
    private Object object=new Object();

    public DTAPP(Object o){
        this.object=o;
    }

    public Object getProxyInstance(){
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("功能的增强");
        method.invoke(object,args);
        return null;
    }
}

 

DTAPP app1=new DTAPP(new ZFB());
        DTAPP app2=new DTAPP(new WX());
        ZZ zfb=(ZZ)app1.getProxyInstance();
        zfb.zz("张三","李四",100.0);
        WZ wx=(WZ)app2.getProxyInstance();
        wx.WXZZ("王五","李梅",89.9);

 


http://www.kler.cn/a/448573.html

相关文章:

  • Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略
  • RHEL 7.5 源码安装 mysql-5.7.17 数据库
  • MySql:基本查询
  • springboot中的AOP以及面向切面编程思想
  • 智能工厂的设计软件 认知系统和内涵智能机 之1
  • Spring Cloud Gateway 源码
  • Django-视图
  • Android 16 关于动态权限使用的变更
  • 监控易在汽车制造行业信息化运维中的应用案例
  • 论文浅尝 | HippoRAG:神经生物学启发的大语言模型的长期记忆(Neurips2024)
  • 带有 Elasticsearch 和 Langchain 的 Agentic RAG
  • 使用Wireshark导出数据包中的文件
  • uniapp开发微信小程序优化项目
  • LiteFlow决策系统的策略模式,顺序、最坏、投票、权重
  • Python中定义函数的操作及理解
  • 前端和后端解决跨域问题的方法
  • 时空信息平台架构搭建:基于netty封装TCP通讯模块(IdleStateHandler网络连接监测,处理假死)
  • 【电商推荐】平衡效率与效果:一种优化点击率预测的LLM融合方法
  • 如何减小wsl的磁盘占用空间
  • JAVA基础:JavaDoc生成文档
  • 【论文解读】CVPR 2019 目标检测:CenterNet技术,以点代框,可扩展性强(附论文地址)
  • 音视频学习(二十五):ts
  • 【03-数据库面试】
  • HTML基础学习(1)
  • 网络安全(5)_访问控制列表ACL
  • 速通Python 第二节