Aop小案例

2023-05-16

AOP小案例

AOP (Aspect Oriented Programming)面向切面编程。
00P (Object Oriented Programming)面向对象编程,用对象化的思想来完成程序。

AOP是对0OP的一个补充,是在另外一个维度上抽象出对象。
具体是指程序运行时动态地将非业务代码切入到业务代码中,从而实现程序的解耦合,将非业务代码抽象成一个对
象,对该对象编程就是面向切面编程。
在这里插入图片描述

上述形式代码维护性差,没有代码复用性。使用AOP进行优化,结果如下图所示。

在这里插入图片描述

AOP的优点

  1. 可以降低模块之间的耦合性
  2. 提高代码的复用性
  3. 提高代码的维护性
  4. 集中管理非业务代码,便于维护
  5. 业务代码不受非业务代码的影响,逻辑更加清晰

通过一个例子来理解AOP

1、创建一个计算器接口Cal

/*
* author:lmh
* date:2022/6/18
*/
public interface Cal {
    //加减乘除
    public int add(int num1, int num2);
    public int sub(int num1, int num2);
    public int mul(int num1, int num2);
    public int div(int num1, int num2);
}

2、Cal接口实现类

public class Calimpl implements Cal {
    int result;
    @Override
    public int add(int num1, int num2) {
        result = num1 + num2;
        return result;
    }

    @Override
    public int sub(int num1, int num2) {
        result = num1 - num2;
        return result;
    }

    @Override
    public int mul(int num1, int num2) {
        result = num1 * num2;
        return result;
    }

    @Override
    public int div(int num1, int num2) {
        result = num1 / num2;
        return result;
    }
}

日志打印

  • 在每个方法开始位置输出参数信息。
  • 在每个方法结束位置输出结果信息。

对于计算器来讲,加减乘除就是业务代码,日志打印就是非业务代码。

/*
* author:lmh
* date:2022/6/18
*/
public class Calimpl implements Cal {
    int result;

    @Override
    public int add(int num1, int num2) {
        System.out.println("add方法的参数是" + num1 + "," + num2);
        result = num1 + num2;
        System.out.println("add方法的结果是:" + result);
        return result;
    }

    @Override
    public int sub(int num1, int num2) {
        System.out.println("sub方法的参数是" + num1 + "," + num2);
        result = num1 - num2;
        System.out.println("sub方法的结果是:" + result);
        return result;
    }

    @Override
    public int mul(int num1, int num2) {
        System.out.println("mul方法的参数是" + num1 + "," + num2);
        result = num1 * num2;
        System.out.println("mul方法的结果是:" + result);
        return result;
    }

    @Override
    public int div(int num1, int num2) {
        System.out.println("div方法的参数是" + num1 + "," + num2);
        result = num1 / num2;
        System.out.println("div方法的结果是:" + result);
        return result;
    }
}

在这里插入图片描述

AOP如何实现?使用动态代理的方式来实现。

代理首先应该具备Calimpl的所有功能,并在此基础上,扩展出打印日志的功能。

1、删除Calimpl方法中所有打印日志的代码,只保留业务代码。
在这里插入图片描述

2、创建MyInvocationHandler类,实现InvocationHandler接口,生成动态代理类。动态代理类,需要动态生成,需要获取到委托类的接口信息,根据这些接口信息动态生成一个代理类,然后再由ClassLoader用来将动态生成的类加载到JVM 中。

/*
* author:lmh
* date:2022/6/18
*/
public class MyInvocationHandler implements InvocationHandler {
    //委托对象
    private Object object = null;

    //返回代理对象
    public Object getbind(Object object) {
        this.object = object;
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //实现业务代码和非业务代码的解耦合
        System.out.println(method.getName()+"方法的参数是" + Arrays.toString(args));
        Object result = method. invoke(this.object,args);
        System.out.println(method.getName()+"方法的结果是:" + result);
        return result;
    }
}
public class Test_Cal {
    public static void main(String[] args) {
        //实例化委托对象
        Cal cal = new Calimpl();
        //获取代理对象
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
        //把委托对象穿进去,返一个代理对象
        Cal proxy = (Cal) myInvocationHandler.getbind(cal);
        proxy.add(7, 2);
        proxy.sub(7, 2);
        proxy.mul(7, 2);
        proxy.div(7, 2);
    }
}

在这里插入图片描述

上述代码通过动态代理机制实现了业务代码和非业务代码的解耦合,这是Spring AOP的底层实现机制,真正在使用Spring AOP进行开发时,不需要这么复杂,可以用更好理解的方式来完成开发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aop小案例 的相关文章

随机推荐

  • 动态库静态库的区别

    1 动态库以及静态库区别 静态库是函数和数据编译进一个二进制文件里面 xff08 lib文件 xff09 xff0c 在使用静态库链接成可执行程序的时候 xff0c 链接器会复制静态库内的函数和数据进可执行程序里面 EXE文件 xff0c
  • ROS 通信—— serial功能包的使用

    serial作为ROS与下位机通讯的功能包 xff0c 可以很方便的供我们与我们的下位机通信 本文全部为个人理解 xff0c 如有错误 xff0c 还请您指导 xff01 前言 xff1a 首先需要下载serial功能包 sudo apt
  • npm 安装Element组件发生报错

    npm 安装Element组件发生报错 npm安装Element插件 打开cmd输入 npm i element ui S 提示 npm WARN deprecated core js 64 2 6 12 core js 64 lt 3 2
  • 酒店管理系统-需求分析报告

    目录 1 引言 1 1编制的目的 1 2术语定义 1 3参考资料 1 4相关文档 2 概述 2 1项目的描述 2 2项目的功能 2 3用户特点 3 具体需求 3 1业务需求 3 1 1主要业务 3 1 2未来增长预测 3 2用户需求 3 3
  • 酒店管理系统-概要设计报告

    目录 1 引言 1 1编制的目的 1 2项目背景 1 3术语定义 1 4参考资料 1 5相关文档 2 总体设计 2 1项目的描述 2 2项目的功能 2 3概念设计和处理流程 2 4系统总体结构设计 2 5系统各功能模块详细说明 2 5 1住
  • 解决 Cannot find module‘[object Object]‘报错问题

    报错信息 xff1a 不可以找到一个module 模块 js中的模块大致与require挂钩 xff0c 可以查看是否有地方错误引用了文件或错误使用了require 修改后即可解决问题
  • Jmeter性能测试(3)---SOAP/XML-RPC Request

    jmeter xff08 三 xff09 SOAP XML RPC Request 项目背景 xff1a 公司的微信端H5界面新开发了会员注册功能 xff0c 需要对其进行压力测试 项目目标 xff1a 需要承受每分钟最少6000的压力 一
  • Pycharm 之Scipy聚类色彩

    一 利用第三方库Scipy聚类 1 可以在jupyter notebook里先尝试一下scipy的功能 聚类的思想为初始先确定均值 xff0c 分类 xff0c 其次计算每组的平均值 xff0c 再次进行分类 xff0c 反复进行使得结果更
  • TM4C123系列(一)————GPIO

    电赛准备搞飞机 xff0c 特地学了下TM4 xff0c 准备用TM4搞飞控 一 实验介绍 点亮TM4C123板载LED 二 原理图 三 所需函数 1 SysCtlClockSet uint32 t ui32Config 参数 xff1a
  • TM4C123系列(三)————PWM输出

    一 实验介绍 使用PWM控制板载LED绿灯与蓝灯交替呼吸闪烁 二 PWM介绍 TM4C123有两个PWM模块 xff0c 每个模块有四个发生器和一个控制模块 xff0c 每个发生器可以产生两路PWM输出 xff0c 一共可以输出16路PWM
  • STM32与K210串口通信的解码问题(基于正点原子源码)

    这次电赛做的声源定位 xff0c 用的麦克风阵列加k210采集声音 xff0c k210需要将数据传送stm32 xff0c 在这里涉及到一个解码问题 xff0c 这个解码是我在之前用stm32与其他设备串口通信中从来没有遇到过的 xff0
  • 【数据结构与算法】数据结构

    数据结构 1 基本概念和术语2 逻辑结构与物理结构3 抽象数据类型 1 基本概念和术语 数据 xff1a 是描述客观事物的符号 xff0c 是计算机中可以操作的对象 xff0c 是能被计算机识别 xff0c 并输入给计算机处理的符号集合 数
  • requests库在爬虫中最常用方法简析

    requests 前言一 安装二 使用方法1 引入库2 发起请求3 获取数据4 其他 三 简单示例总结 前言 requests是基于urlib3的用于发起http请求的python第三方库 xff0c 使用方便 xff0c 响应快速 一 安
  • 爬取英语六级高频词

    文章目录 任务一 指定url二 发起请求并获取响应数据三 对响应数据进行数据解析四 持久化存储总结 任务 将网站中所有英语六级高频词以及翻译获取 xff0c 然后进行存储 一 指定url 网站中单词被分开存放在1 7页中 第1页的url x
  • 基于tkinter的第一个GUI小项目:背英语六级单词软件

    文章目录 任务1 引入库2 读入数据3 打开窗口4 初始化5 放置标签和按钮6 按钮事件7 演示 任务 基于爬取到的英语六级高频词 xff0c 利用python中的tkinter做出一个能起到考察词汇掌握情况作用的GUI 1 引入库 spa
  • Linux 6.1/6.2发布新补丁:缓解AMD处理器fTPM间歇性卡顿问题

    导读早些时候 xff0c AMD承认 xff0c 在Linux系统中开启AMD锐龙处理器的fTPM xff0c 将可能导致系统出现间歇性的卡顿 死机等情况 据悉 xff0c 该Bug在Linux 6 1内核中表现得最为明显 xff0c 这是
  • RHCE. Stratis 管理分层存储

    通过Stratis xff0c 便捷的使用精简配置 xff08 thin provisioning xff09 xff0c 快照 xff08 snapshots xff09 和基于池 xff08 pool based xff09 的管理和监
  • Jmeter性能测试(5)--JDBC Request

    jmeter xff08 五 xff09 JDBC Request jmeter中取样器 xff08 Sampler xff09 是与服务器进行交互的单元 一个取样器通常进行三部分的工作 xff1a 向服务器发送请求 xff0c 记录服务器
  • jQuery获取或设置元素的属性值prop/attr

    获取元素的属性值 固有属性 39 div prop color 自定义属性 39 div attr index html代码 lt a href 61 34 www baidu com 34 title 61 34 百度 34 gt 百度
  • Aop小案例

    AOP小案例 AOP Aspect Oriented Programming 面向切面编程 00P Object Oriented Programming 面向对象编程 xff0c 用对象化的思想来完成程序 AOP是对0OP的一个补充 xf