Spring5应用之静态代理开发

作者简介 :☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏
当前专栏Spring5应用专栏_Aomsir的博客

前言

在之前的学习中,我们已经对AOP(面向切面编程)以及代理设计模式进行了初步的了解。今天,本篇文章将深入探讨静态代理的概念和实践。我们将一步一步地走进静态代理的实战应用,以确保对这一重要概念有个深入、全面的理解

何为静态代理?

静态代理是代理设计模式的一种常见实现方式,其核心是为指定的对象提供一个代理,从而管理和控制对该对象的访问。与其他代理方法不同的是,在静态代理中,代理类和目标类在编译阶段就被固定 ,而非运行时动态生成。要理解静态代理,我们需要关注其三大核心角色:目标接口目标实现类以及代理类。通过使用静态代理,我们能够轻松地为原始业务代码注入额外的功能,如日志记录、性能跟踪等,而无需修改原始代码

开发编码

  • 创建目标接口
  • 创建目标实现类
  • 创建代理实现类
  • 编码测试
java 复制代码
public interface UserService {
    public void register(User user);

    public boolean login(String name, String password);
}
java 复制代码
public class UserServiceImpl implements UserService {

    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);

    @Override
    public void register(User user) {
        log.info("UserServiceImpl.register() 核心业务运算 + DAO");
    }

    @Override
    public boolean login(String name, String password) {
        log.info("UserServiceImpl.login() 核心业务运算 + DAO");
        return true;
    }
}
java 复制代码
public class UserServiceProxy implements UserService {

    private static final Logger log = LoggerFactory.getLogger(UserServiceProxy.class);
    private UserService userService = new UserServiceImpl();

    @Override
    public void register(User user) {
        log.debug("---------日志功能(额外功能)---------");
        this.userService.register(user);
    }

    @Override
    public boolean login(String name, String password) {
        log.debug("---------日志功能(额外功能)---------");
        return this.userService.login(name, password);
    }
}
java 复制代码
public class TestProxy {
    @Test
    public void test1() {
        UserService userService = new UserServiceProxy();

        userService.login("Aomsir", "123456");

        userService.register(new User());
    }
}

测试结果

在上述测试代码中,我们没有直接调用原始类的方法,而是通过代理类来进行调用。这样,代理类帮助我们管理了对原始类方法的访问。从测试结果可以看出,尽管我们使用了代理,原始类的核心功能仍然被完整地执行了.

问题

在上面的示例代码中,对于每一个业务类,我们都需要定义两个类:一个原始类一个代理类 。原始类负责实现接口并编写核心的业务逻辑,而代理类则在每个接口的实现方法中添加额外的操作,同时调用原始类的相应方法。乍看之下,这种设计似乎还算简洁,但仔细分析之后,我们可以发现其中潜藏的多个问题。

首先,这种设计使得项目中的代码量大大增加。每一个业务类的设计都伴随着一个代理类,这意味着为了实现一个功能,我们实际上需要编写两个类。这无疑增加了代码的复杂性,并可能导致结构上的混乱。

其次,代码的冗余度很高。考虑一个常见的场景:如果我们想为核心业务的每个操作加上日志记录,那么代理类中的每一个方法都需要添加日志代码。这不仅增加了代码量,还降低了代码的可读性和可维护性

为了解决上述问题,我们可能需要考虑其他的代理模式,如动态代理,它可以在运行时动态地为目标类生成代理,从而减少手动编写冗余代码的需要。通过这种方式,我们可以更加高效地为业务类添加额外的操作,同时保持代码的整洁和可维护性

参考文献

相关推荐
计算机-秋大田2 小时前
基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)
spring boot·后端·学习·微信小程序·小程序
matlabgoodboy2 小时前
留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB
开发语言·后端·ruby
SomeB1oody5 小时前
【Rust自学】15.7. 循环引用导致内存泄漏
开发语言·后端·rust
m0_748256565 小时前
跨域问题解释及前后端解决方案(SpringBoot)
spring boot·后端·okhttp
码界筑梦坊6 小时前
基于Django的Boss直聘IT岗位可视化分析系统的设计与实现
后端·python·django·毕业设计
梦想画家7 小时前
Golang 并发机制-1:Golang并发特性概述
后端·golang
小猫猫猫◍˃ᵕ˂◍14 小时前
go理论知识记录(入门2)
开发语言·后端·golang
雨 子15 小时前
SpringBoot统一数据返回格式 & 统一异常处理
java·spring boot·后端
Cikiss17 小时前
「全网最细 + 实战源码案例」设计模式——适配器模式
java·后端·设计模式·适配器模式
abstractclass21 小时前
Apifox IDEA 插件使用指南 - 从入门到精通(3)
后端