• 暑期JAVA学习(45)动态代理


    一、案例准备、提出问题

    (1)案例:模拟企业业务功能开发,并完成每个功能的性能统计

    ①需求
    • 模拟某企业用户管理业务,需包含用户登录,用户删除,用户查询功能,并要统计每个功能的耗时
    ②分析
    • 定义一个UserService表示用户业务接口,规定必须完成用户登录,用户删除,用户查询功能。
    • 定义一个实现类UserServiceImpl实现UserService,并完成相关功能,且统计每个功能的耗时。
    • 定义测试类,创建实现类对象,调用方法。
    ③具体使用

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    /**
     * 模拟用户业务功能
     */
    public interface UserService {
        String login(String loginName,String password);
        void selectUsers();
        boolean deleteUsers();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    public class UserServicelmpl implements UserService{
        @Override
        public String login(String loginName, String password) {
            long startTimer = System.currentTimeMillis();
            try {
                    Thread.sleep(1000);
                if ("admin".equals(loginName) && "6666".equals(password)){
                    return "登陆成功!";
                }
                return "您的用户名或密码错误!!!";
                } catch (Exception e) {
                    e.printStackTrace();
                    return "error";
                } finally {
                long endTimer = System.currentTimeMillis();
                System.out.println("login方法耗时:" + (endTimer - startTimer) /1000.0 + 's');
            }
        }
    
        @Override
        public void selectUsers() {
            long startTimer = System.currentTimeMillis();
            System.out.println("已查询了100个用户数据");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            long endTimer = System.currentTimeMillis();
            System.out.println("selectUsers方法耗时:" + (endTimer - startTimer) /1000.0 + 's');
        }
    
        @Override
        public boolean deleteUsers() {
            long startTimer = System.currentTimeMillis();
            try {
                System.out.println("已删除了100个用户数据");
                Thread.sleep(500);
                return true;
            } catch (InterruptedException e) {
                e.printStackTrace();
                return false;
            }finally {
                long endTimer = System.currentTimeMillis();
                System.out.println("deleteUsers方法耗时:" + (endTimer - startTimer) /1000.0 + 's');
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    public class Test {
        public static void main(String[] args) {
            UserService userService = new UserServicelmpl();
            System.out.println(userService.login("admin", "6666"));
            System.out.println(userService.deleteUsers());
            userService.selectUsers();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    ③本案例存在哪些问题
    • 业务对象的的每个方法都要进行性能统计,存在大量重复的代码

    二、使用动态代理解决问题

    (1)什么是动态代理

    • 代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。

    (2)动态代理的关键步骤

    ①必须有接口,实现类要实现接口(代理通常是基于接口实现的)
    ②创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个代理对象
    在这里插入图片描述

    (3)使用动态代理实现案例

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    (4)动态代理的优点

    • 非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。
    • 可以为被代理对象的所有方法做代理。
    • 可以在不改变方法源码的情况下,实现对方法功能的增强。
    • 不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。
  • 相关阅读:
    lkx语言的总体设计已经发布到github上 (https://github.com/lichuan/lkx)
    九齐ny3p系列语音芯片替代国产方案KT148A性价比更高420秒长度
    user-agent怎么获取
    在线编码、格式转换
    Keras CIFAR-10图像分类 GoogleNet 篇
    python 词云(Word Cloud)设计
    传统安防音视频平台架构
    使用VScode搭建Rust开发环境
    Pytorch:复现PointNet
    今天的消费情况
  • 原文地址:https://blog.csdn.net/xjl243636988/article/details/126323665