码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 暑期JAVA学习(45)动态代理


    动态代理

      • 一、案例准备、提出问题
          • (1)案例:模拟企业业务功能开发,并完成每个功能的性能统计
            • ①需求
            • ②分析
            • ③具体使用
            • ③本案例存在哪些问题
      • 二、使用动态代理解决问题
          • (1)什么是动态代理
          • (2)动态代理的关键步骤
          • (3)使用动态代理实现案例
          • (4)动态代理的优点

    一、案例准备、提出问题

    (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)动态代理的优点

    • 非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。
    • 可以为被代理对象的所有方法做代理。
    • 可以在不改变方法源码的情况下,实现对方法功能的增强。
    • 不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。
  • 相关阅读:
    C#/.NET/.NET Core优秀项目和框架精选(坑已挖,欢迎大家踊跃提交PR或者Issues中留言)
    捷报连连!怿星科技荣获北京市科学技术进步奖一等奖
    【Java 基础篇】Java Properties 详解:配置文件和键值对存储
    阿里15年技术老兵用140个案例整合出Java微服务架构实战
    SpringCloud微服务 【实用篇】| 认识微服务
    Jenkins + Gitee 实现代码自动化构建 (超级详细)
    Python机器学习016:pytorch张量与数据类型
    Apache 董事会即将终止 Apache Ambari 项目
    SpringIOC的原理以及源码
    始祖双碳新闻 | 2022年8月26日碳中和行业早知道
  • 原文地址:https://blog.csdn.net/xjl243636988/article/details/126323665
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号