4. AOP

1 AOP能解决什么问题

1.1 提出问题

1.1.1 情景:数学计算器
1.1.1.1 要求

①执行加减乘除运算
②日志:在程序执行期间追踪正在发生的活动
在这里插入图片描述

ArithmeticCalculator.java

public interface ArithmeticCalculator {double add(double a, double b);double sub(double a, double b);double mul(double a, double b);double div(double a, double b);
}

ArithmeticCalculatorImpl.java

public class ArithmeticCalculatorImpl implements ArithmeticCalculator {@Overridepublic double add(double a, double b) {return a + b;}@Overridepublic double sub(double a, double b) {return a - b;}@Overridepublic double mul(double a, double b) {return a * b;}@Overridepublic double div(double a, double b) {return a / b;}
}
1.1.1.2 常规实现

ArithmeticCalculatorImpl.java

public class ArithmeticCalculatorImpl implements ArithmeticCalculator {@Overridepublic double add(double a, double b) {System.out.println("The method add begins with [" + a + ", " + b + "]");double result = a + b;System.out.println("The method add ends with " + result);return result;}@Overridepublic double sub(double a, double b) {System.out.println("The method sub begins with [" + a + ", " + b + "]");double result = a - b;System.out.println("The method sub ends with " + result);return result;}@Overridepublic double mul(double a, double b) {System.out.println("The method sub begins with [" + a + ", " + b + "]");double result = a * b;System.out.println("The method sub ends with " + result);return result;}@Overridepublic double div(double a, double b) {System.out.println("The method sub begins with [" + a + ", " + b + "]");double result = a / b;System.out.println("The method sub ends with " + result);return result;}
}
1.1.1.3 问题

①代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀。每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点。
②代码分散: 以日志需求为例,只是为了满足这个单一需求,就不得不在多个模块(方法)里多次重复相同的日志代码。如果日志需求发生变化,必须修改所有模块。

1.2 动态代理

1.2.1 动态代理的原理

代理设计模式的原理:使用一个代理将原本对象包装起来,然后用该代理对象”取代”原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
在这里插入图片描述

1.2.2 动态代理的方式
  • 基于接口实现动态代理: JDK动态代理
  • 基于继承实现动态代理: Cglib、Javassist动态代理

1.3 数学计算器的改进(JDK动态代理)

1.3.1 日志处理器

CalculatorLoggingHandler.java

public class CalculatorLoggingHandler implements InvocationHandler {private Object target;public CalculatorLoggingHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("The method " + method.getName() + "() begins with " + Arrays.toString(args));Object result = method.invoke(target, args);System.out.println("The method " + method.getName() + "() ends with " + result);return result;}public static Object createProxy(Object target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new CalculatorLoggingHandler(target));}
}

1.3.2 测试代码

Main.java

public class Main {public static void main(String[] args) {ArithmeticCalculatorImpl arithmeticCalculator = new ArithmeticCalculatorImpl();ArithmeticCalculator proxy = (ArithmeticCalculator) CalculatorLoggingHandler.createProxy(arithmeticCalculator);System.out.println(proxy.add(12, 13));}
}

1.3.3 测试结果

The method add() begins with [12.0, 13.0]
The method add() ends with 25.0
25.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/308774.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI面板识别 - 华为OD统一考试

OD统一考试 (B卷) 分值: 100分 题解: Java / Python / C++ 题目描述 AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。 由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2…

Centos安装Kafka(KRaft模式)

1. KRaft引入 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer,以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 由…

EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了

EasyNTS上云平台可通过远程访问内网应用,包含网络桥接、云端运维、视频直播等功能,极大地解决了现场无固定IP、端口不开放、系统权限不开放等问题。平台可提供一站式上云服务,提供直播上云、设备上云、业务上云、运维上云服务,承上…

爬虫工作量由小到大的思维转变---<第三十五章 Scrapy 的scrapyd+Gerapy 部署爬虫项目>

前言: 项目框架没有问题大家布好了的话,接着我们就开始部署scrapy项目(没搭好架子的话,看我上文爬虫工作量由小到大的思维转变---<第三十四章 Scrapy 的部署scrapydGerapy>-CSDN博客) 正文: 1.创建主机: 首先gerapy的架子,就相当于部署服务器上的;所以…

Collector收集器的高级用法

Collectors收集器的高级用法 场景1:获取关联的班级名称 原先如果需要通过关联字段拿到其他表的某个字段,只能遍历List匹配获取 for (Student student : studentList) {Long clazzId student.getClazzId();// 遍历班级列表,获取学生对应班级…

超维空间S2无人机使用说明书——51、基础版——使用yolov8进行目标跟踪

引言:为了提高yolo识别的质量,提高了yolo的版本,改用yolov8进行物体识别,同时系统兼容了低版本的yolo,包括基于C的yolov3和yolov4,以及yolov7。 简介,为了提高识别速度,系统采用了G…

数据结构与算法-排序

🌞入冬 时寒 添衣 勿病 要开心 排序 🎈1.排序的基本概念🎈2.排序的分类🔭2.1插入排序🔎2.1.1直接插入排序🔎2.1.2折半插入排序🔎2.1.3希尔排序 🔭2.2交换排序🔎2.2.1冒泡…

07-项目打包 React Hooks

项目打包 项目打包是为了把整个项目都打包成最纯粹的js,让浏览器可以直接执行 打包命令已经在package.json里面定义好了 运行命令:npm run build,执行时间取决于第三方插件的数量以及电脑配置 打包完之后再build文件夹下,这个…

啊?这也算事务?!

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

Spring Boot学习随笔- 集成MyBatis-Plus,第一个MP程序(环境搭建、@TableName、@TableId、@TableField示例)

学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 引言 MyBatis-Plus是一个基于MyBatis的增强工具,旨在简化开发,提高效率。它扩展了MyBatis的功能,提供了许多实用的特性,…

golang第六卷---go命令

go命令 go/go helpgo versiongo envgo buggo buildgo installgo getgo modgo rungo cleango docgo fixgo fmtgo generatego workgo testgo toolgo vet go/go help 通过该命令,我们可以查看go语言中的所有命令,其中go与go help两个命令是等效的 如下&…

实时数仓应用价值(上)

欢迎关注WX公众号:数据运营入表资产化服务 获取更多算法源码材料 2023数据资源入表白皮书,推荐系统源码下载-CSDN博客 浅析研发支出费用化和资本化的区别-CSDN博客 商业银行数据资产估值白皮书,推荐系统源码下载-CSDN博客 用友BIP数据资…