Spring 从入门到精通 (十一) 静态代理登场

举报
周棋洛 发表于 2022/07/23 23:48:28 2022/07/23
【摘要】 关键词:Spring | 静态代理 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一、代理引言二、名词...

关键词:Spring | 静态代理

本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨

在这里插入图片描述

一、代理引言

先说一下生活中常见的代理,小伙伴会问,我咋没听说过生活中有代理呢?哈哈,是有的但可能不叫代理,但都是一个意思,比如你听过的中介和代理是一个意思。

假如说我现在装备买房,我会去找中介对吧,其实中介在这个过程就充当了代理,他辅助房主买房,房主不想每天花太多心思在房子上,因为还有其他重要的事情等着房主呢?所以,房主把这些事交给了代理来做,即房产中介。

回到代码中,业务层是不是很重要,对,非常重要,那么我希望我的业务层明确的处理业务,不要再加入其他的代码,有小伙伴问,除了业务还有其他代码?哈哈,必须有,比如事务操作,日志记录,性能分析等等,我们统统把他们称为次要业务,像这种脏活累活我也希望在代码中也给他找一个代理。

二、名词解释

原始类,目标类

指的是核心功能类,比如业务类,做业务处理和调用DAO

原始方法,目标方法

原始类中的方法就是原始方法

额外功能,附加操作

比如,事务,日志,性能等等

三、如何开发一个代理对象

  1. 代理对象要和原始业务对象有同一个规定,放在面向对象中就是实现同一个接口(interface)
  2. 代理对象依赖业务对象

四、静态代理开发

目录结构如下:

在这里插入图片描述

pom.xml依赖如下

主要使用了单元测试框架 Junit 和效率插件 Lombok

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>
</dependencies>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

User实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private String pwd1;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

UserService接口

public interface UserService {
    void register(User user);
    boolean login(String name, String pwd1);
}

  
 
  • 1
  • 2
  • 3
  • 4

UserServiceImpl实现类

public class UserServiceImpl implements UserService{
    @Override
    public void register(User user) {
        System.out.println("UserServiceImpl register + DAO");
    }

    @Override
    public boolean login(String name, String pwd1) {
        System.out.println("UserServiceImpl login + DAO");
        return true;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

UserServiceProxy 静态代理类

UserServiceProxy 静态代理类和实现原始对象的统一接口,同时依赖原始对象完成业务操作的同时,执行一些附加操作。

public class UserServiceProxy implements UserService {

    private UserServiceImpl userService = new UserServiceImpl();

    @Override
    public void register(User user) {
        System.out.println("----日志-----");
        userService.register(user);
    }

    @Override
    public boolean login(String name, String pwd1) {
        System.out.println("----日志----");
        return userService.login(name, pwd1);
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

测试类

/**
 * 静态代理测试
 */
@Test
public void t1(){
    UserServiceProxy userServiceProxy = new UserServiceProxy();
    User user = new User();
    String name = "小张";
    String pwd1 = "123412";
    userServiceProxy.register(user);
    userServiceProxy.login(name,pwd1);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

测试结果

----日志-----
UserServiceImpl register + DAO
----日志----
UserServiceImpl login + DAO

  
 
  • 1
  • 2
  • 3
  • 4

没有问题,

五、静态代理的缺点

注意了,为啥叫静态代理类呢?因为我们每开发一个业务层,就要同时手动开发一个代理类从而完成代理,这就是静态代理的特点,那他有什么缺点呢?

1. 有一个原始类,就要提供一个代理类,随着业务扩大,不利于项目管理

2. 额外功能的维护性差,随着业务复杂,代理类中的附加操作修改起来越来越麻烦

六、写在最后

座右铭:不要在乎别人如何看你,要在乎你自己如何看未来,看梦想,看世界…!

一起学习的可以私信博主或添加博主微信哦。

专栏:订阅专栏 ✅
关注:关注博主 🆙

文章来源: blog.csdn.net,作者:王子周棋洛,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_53321320/article/details/125900777

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。