为了满足两个需求

1、打印每个请求从开始到结束的耗时

2、校验某些请求的当前用户是否登录

可以在 Service 的实现类 ServiceImpl 中改造,增加耗时打印和校验登录代码。

//耗时统计
long start = System.currentTimeMillis();//计时开始
...
long end = System.currentTimeMillis();//计时结束
System.out.println("耗时:" + (end - start) + "毫秒");//打印耗时
/*** 模拟  当前用户是否登录*/
private boolean checkIsLogined() {Random r = new Random();int i = r.nextInt(10);if (i % 2 == 0) {System.out.println("已登录");return true;}System.out.println("未登录");return false;
}

完整代码:

package constxiong.cxproxy.chapter2.service;import java.util.HashMap;
import java.util.Map;
import java.util.Random;/*** 服务接口实现* @author ConstXiong* @date 2019-05-29 11:02:15*/
public class ServiceImpl implements Service {@Overridepublic boolean login(String username, String password) {long start = System.currentTimeMillis();//计时开始simulateDaOperation(100);System.out.println("用户名:" + username + ", 密码:" + password + "  登录成功");long end = System.currentTimeMillis();//计时结束System.out.println("耗时:" + (end - start) + "毫秒");//打印耗时return true;}@Overridepublic Map<String, Object> getUserInfo(String username) {long start = System.currentTimeMillis();//计时开始Map<String, Object> userInfo = null;//校验是否登录if (checkIsLogined()) {userInfo = new HashMap<String, Object>();simulateDaOperation(150);userInfo.put("username", username);userInfo.put("sex", "男");userInfo.put("age", 18);System.out.println("用户名:" + username + ", 获取用户信息:" + userInfo);}long end = System.currentTimeMillis();//计时结束System.out.println("耗时:" + (end - start) + "毫秒");//打印耗时return userInfo;}/*** 模拟  当前用户是否登录*/private boolean checkIsLogined() {Random r = new Random();int i = r.nextInt(10);if (i % 2 == 0) {System.out.println("已登录");return true;}System.out.println("未登录");return false;}/*** 模拟数据库操作,休眠* @param millis 毫秒数*/private void simulateDaOperation(long millis) {try {Thread.sleep(millis);} catch (InterruptedException e) {e.printStackTrace();}}}

未登录打印:

用户名:ConstXiong, 密码:123456  登录成功
耗时:100毫秒
未登录
耗时:1毫秒

已登录打印:

用户名:ConstXiong, 密码:123456  登录成功
耗时:100毫秒
已登录
用户名:ConstXiong, 获取用户信息:{sex=男, age=18, username=ConstXiong}
耗时:152毫秒

完整源码:https://github.com/ConstXiong/xtools    cxproxy项目 chapter2

思考:

这种做法的缺点很明显:每次需求变更,核心的业务代码就需要改动,这块就得重测。
有没有做法可以不用修改核心业务代码,也能完成两个功能?有,使用代理。


【Java面试题与答案】整理推荐

  • 基础与语法
  • 集合
  • 网络编程
  • 并发编程
  • Web
  • 安全
  • 设计模式
  • 框架
  • 算法与数据结构
  • 异常
  • 文件解析与生成
  • Linux
  • MySQL
  • Oracle
  • Redis
  • Dubbo

Chapter 2、不使用代理相关推荐

  1. Chapter 4、JDK 动态代理

    为了解决静态代理的带来的问题: 代理类需要实现与目标类一样的接口,会导致代理类数量较多,不易维护 一旦接口增加方法,目标类和代理类都需要维护 JDK 提供了动态代理,实现动态代理满足下列条件: 代理类 ...

  2. Chapter 5、CGLib 动态代理

    为了解决 JDK 的动态代理无法代理不实现接口的类的问题,可以使用 CGLib 的实现动态代理. CGLib(Code Generator Library)是一个强大的.高性能的代码生成库.底层使用了 ...

  3. Chapter 7 代理模式

    代理模式:为其它对象提供一种代理以控制对这个对象的访问. 代码: package xiao; class Girl{ private String name; public void setName( ...

  4. Chapter 1 快速搭建-服务的注册与发现(Eureka)

    Chapter 1 快速搭建-服务的注册与发现(Eureka) 一.Spring Cloud简介 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代 ...

  5. 【翻译】Xv6 book Chapter 8:File system

    Chapter 8 File system 文件系统的目的是阻止和存储数据.文件系统持久地支持在用户和应用之间分享数据,所以这些数据在重启之后仍然是可以得到的. xv6的文件系统提供了类Unix的文件 ...

  6. 《Migrating to Cloud-Native Application Architectures》学习笔记之Chapter 3. Migration Cookbook...

    2019独角兽企业重金招聘Python工程师标准>>> New Features as Microservices 微服务的新特性 想从单体应用走向微服务,第一步就是不再王单体应用中 ...

  7. SSH Chapter 04 Hibernate 入门

    SSH Chapter 04 Hibernate入门 笔记 Hibernate 知识体系图: 本章目标: 理解类和表的映射关系 掌握单表的增删改 掌握按主键查询 理解持久化对象的状态及其转换 技术内容 ...

  8. Umbral:新型分散式密钥管理系统的代理重加密方案

    前言 现在,我们非常高兴地宣布,我们在定义( https://github.com/nucypher/umbral-doc/blob/master/umbral-doc.pdf )和实现( https ...

  9. SSM Chapter 05 Spring 核心概念

    SSM Chapter 05 Spring 核心概念 笔记 本章目标: 理解Spring IoC的原理 掌握Spring IoC的配置 理解Spring AOP的原理 掌握Spring AOP的配置 ...

最新文章

  1. 删除链表的中间节点和a/b处的节点
  2. 举例说明信息熵、互信息的计算过程
  3. MatConvnet中集成的损失函数(孪生网络的思考)
  4. HDU4267(2012年长春站)
  5. Java学习笔记_身份验证机制
  6. 前端性能优化篇——浏览器http同域名并发请求对限制
  7. java中Map ListE的用法
  8. js中定义用字符串拼接起来的变量名的变量
  9. 文档级关系抽取方法总结
  10. 不忘初心,不负韶华——2021年中会议发言之一
  11. Debian5.0自动挂载U盘 - 使用pmount
  12. 量子计算机预测未来,太厉害了吧?这台量子计算机能预测16种不同的未来!
  13. 常用Linux命令--CPU和GPU查看
  14. 计算机启动时默认输入法设置,每次开机都需要重设,教你电脑输入法怎么设置默认模式...
  15. ADB远程桌面连接本地手机
  16. 华硕 fx-pro(GL552VW) 修改BIOS,关闭超线程
  17. 专题·快速沃尔什变换(FWT)【including FWT,洛谷P4717【模板】快速沃尔什变换
  18. 金蝶K3提取供应商信息生成在线Web页面供应商信息一览表
  19. c语言源码什么意思,请问C语言源代码什么意思?
  20. 网络天气预报项目笔记(Qt)

热门文章

  1. 影视剧中的武汉取景地,你去过几个?
  2. 单例模式(懒汉单例和饿汉单例)
  3. python-python爬取豆果网(菜谱信息)
  4. GitHub 上有什么好玩又有挑战的前端项目?
  5. 深度学习去燥学习编码_学习编码的警示故事。 我自己的。
  6. 可以观看CCTV-5高清直播的网站-天天直播_我是亲民_新浪博客
  7. Linux学习笔记——系统函数IO
  8. python爬虫有什么好处_python为什么叫爬虫 python有什么优势
  9. 【OpenCV-Python】5.OpenCV的图形用户界面窗口控制
  10. HEVC码率控制资料整理