Spring中静态代理设计模式

目录

一、为什么需要代理设计模式

二、代理设计模式

三、静态代理设计模式

[3.1 存在的问题](#3.1 存在的问题)


一、为什么需要代理设计模式

在项目的开发过程中我们知道service层是整个项目中最重要的部分,在service中一般会有两个部分,一个是核心业务 ,一个是额外功能。那么问题来了,这个额外功能放在service层好不好呢?其实在service中有额外功能是不好的,是不利于代码的维护的。所以这里就有了代理设计模式

这样的案例在生活中也是很常见的,就好比说租房中的中介公司就是一个代理(代理类),当有人需要租房的时候直接去找中介公司就可以了,通过中介公司也可以对接到房东签合同,这样就省去了房东自己去打广告的麻烦,所以代理设计模式是非常有必要的!

二、代理设计模式

通过上述的描述,我们发现代理设计模式就是通过一个代理类,为目标类增加额外的功能,这样做的目的就是利于目标类的维护。

1)代理开发的核心要素

由上述过程我们发现在代理类中,目标类的功能是需要有的(中介没有房东出租屋的信息怎么租房呢)同时还需要额外的功能(既然是中介公司那肯定要有广告信息)。有了这两个概念之后我们就能知道代理类和目标类应该实现同一个接口

2)编码实现

首先应该有一个service的接口类,这里直接创建一个UserService接口类

java 复制代码
public interface UserService {
    void register();
    boolean login();
}

接下来再创建一个目标类UserServiceImpl实现这个接口(这个就好比是房东)

java 复制代码
public class UserServiceImpl implements UserService{
    @Override
    public void register() {
        System.out.println("register核心功能正在执行");
    }
    @Override
    public boolean login() {
        return false;
    }
}

最后创建一个代理类UserServiceProxy,这个类既要有目标类的功能,也要有自己的额外功能(中介的广告)

java 复制代码
public class UserServiceProxy implements UserService{
    // 需要有目标类的方法,所以这里需要有目标类
    UserServiceImpl user = new UserServiceImpl();
    @Override
    public void register() {
        // 添加额外功能,这里就不写复杂功能了,打印代替
        System.out.println("----这里是额外功能的添加----log");
        // 将目标类的方法实现
        user.register();
    }
    @Override
    public boolean login() {
        // 添加额外功能,这里就不写复杂功能了,打印代替
        System.out.println("----这里是额外功能的添加----log");
        return user.login();
    }
}

3)进行测试

此时就可以发现这里的目标类中的核心方法执行了,同时这里的额外功能也执行了,这时说明代理的过程已经成功了

java 复制代码
public void test1() {
    UserService userService = new UserServiceProxy();
    userService.register();
    userService.login();
}

三、静态代理设计模式

上述的代理的过程称为静态代理模式:为每一个目标类手工编写一个代理类。

3.1 存在的问题

静态代理的过程中我们会发现其实存在一些问题,因为每一个目标类都需要手动编写一个代理类,那么在这个过程中如果代理类过多就会使得项目的管理难度上升。同时,在静态代理的过程中这些额外功能都是已经写死在代理类中了,后续想要修改这些额外功能就会变得非常的复杂!说了这么多,那有解决办法吗?有!那就是Spring提供的动态代理开发!

相关推荐
天远Date Lab4 分钟前
Java微服务实战:聚合型“全能小微企业报告”接口的调用与数据清洗
java·大数据·python·微服务
lizz318 分钟前
C++操作符重载深度解析
java·c++·算法
武子康9 分钟前
Java-205 RabbitMQ 工作模式实战:Work Queue 负载均衡 + fanout 发布订阅(手动ACK/QoS/临时队列)
java·性能优化·消息队列·系统架构·rabbitmq·java-rabbitmq·mq
CodeCraft Studio9 分钟前
Vaadin 25 正式发布:回归标准Java Web,让企业级开发更简单、更高效
java·开发语言·前端·vaadin·java web 框架·纯java前端框架·企业级java ui框架
Haoea!20 分钟前
JDK21新特性-序列集合
java
快乐非自愿29 分钟前
Java函数式接口——渐进式学习
java·开发语言·学习
wanghowie36 分钟前
01.01 Java基础篇|语言基础与开发环境速成
java·开发语言
白露与泡影38 分钟前
2026年Java面试题目收集整理归纳(持续更新)
java·开发语言·面试
百***78751 小时前
【技术教程】3步极速接入GPT-5.1:零门槛体验多模态AI能力
android·java·人工智能·gpt·opencv
默 语1 小时前
IPIDEA 代理技术在海外品牌社媒数据采集中的实操落地(Instagram 营销分析案例版)
java·人工智能·ai·ai编程