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>

User实体类

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

UserService接口

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

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;
    }
}

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);
    }

}

测试类

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

测试结果

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

没有问题,

五、静态代理的缺点

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

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

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

六、写在最后

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

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

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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王子周棋洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值