AOP理解——模拟带有横切逻辑的实例

2023-10-20 04:10

本文主要是介绍AOP理解——模拟带有横切逻辑的实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spring使用动态代理技术在运行期间织入增强的代码。Spring AOP 使用两种动态代理机制:一种是基于JDK的动态代理;另一种是基于CGLib的动态代理。之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理。

带有横切逻辑的实例

package com.hegx.spring.aop.service.impl;

import com.hegx.spring.aop.Forum;
import com.hegx.spring.aop.PerformanceMonitor;
import com.hegx.spring.aop.dao.ForumDao;
import com.hegx.spring.aop.dao.impl.ForumDaoImpl;
import com.hegx.spring.aop.service.ForumService;

/**
 * @Author: hegx
 * @Description:
 * @Date: 14:25 2017/7/16
 */
public class ForumServiceImpl implements ForumService {private ForumDao forumDao = new ForumDaoImpl();

    @Override
    public void remove(Integer forumId) {//开始对方法进行性能监视
        PerformanceMonitor.begin("com.hegx.spring.aop.service.impl.ForumServiceImpl.remove");
        forumDao.remove(forumId);
        try {Thread.currentThread().sleep(20);
        } catch (InterruptedException e) {e.printStackTrace();
        }//结束对方法进行性能监视
        PerformanceMonitor.end();
    }@Override
    public void create(Forum forum) {//开始对方法进行性能监视
        PerformanceMonitor.begin("com.hegx.spring.aop.service.impl.ForumServiceImpl.remove");

        forumDao.create(forum);

        try {Thread.currentThread().sleep(2000);
        } catch (InterruptedException e) {e.printStackTrace();
        }//结束对方法进行性能监视
        PerformanceMonitor.end();
    }
}
 
上面带绿色的代码就是具有横切逻辑的代码,每个dao的实现前后都要执行先后的代码,也就是相同的逻辑。

上面的PerformanceMonitor是性能监视的类,我们给出一个非常简单的实现版本,期待吗如下:

package com.hegx.spring.aop;

/**
 * @Author: hegx
 * @Description:
 * @Date: 14:33 2017/7/16
 */
public class PerformanceMonitor {//通过一个ThreadLocal保存调用线程先关的性能监视信息
    private static  ThreadLocal<MethodPerformance> performanceRecord = new ThreadLocal<>();

    //启动对某一个方法的性能监视
    public static void begin(String method){System.out.println("begin Monitor...");
        MethodPerformance mp = new MethodPerformance(method);
        performanceRecord.set(mp);
    }//启动对某一个方法的性能监视
    public static void end(){System.out.println("end Monitor...");
        MethodPerformance mp = performanceRecord.get();

        //打印出方法性能监视的结果信息
        mp.printPerformance();
    }}

ThreadLoacl是将非线程安全类改造成线程安全类的法宝。PerformanceMonitor提供两个方法:通过调用begin(String method)方法开始对目标类方法的监视,method是目标类全限定名;而end()方法结束对目标类方法性能监视,并给出性能监视信息。这两个方法必须配套使用。

用于记录性能类的信息MethodPerformance类的代码如下:

package com.hegx.spring.aop;

/**
 * @Author: hegx
 * @Description:用于记录性能监视信息的类
 * @Date: 14:36 2017/7/16
 */
public class MethodPerformance {private Long begin;

    private Long end;

    private String serviceMethod;


    public MethodPerformance(String serviceMethod) {this.serviceMethod = serviceMethod;

        this.begin = System.currentTimeMillis();//记录目标类方法的开始执行点的时间
    }public void printPerformance(){end = System.currentTimeMillis();//获取目标类方法执行完成后的系统时间,并进而计算出目标类方法执行时间

        Long elapse = end - begin;

        System.out.println(serviceMethod+"花费了"+elapse+"毫秒");//打印目标类方法执行的时间
        System.out.println();
    }}

通过下面的代码测试性能监视能力的ForumServiceImpl业务方法:

package com.hegx.spring.aop.test;

import com.hegx.spring.aop.Forum;
import com.hegx.spring.aop.service.ForumService;
import com.hegx.spring.aop.service.impl.ForumServiceImpl;

/**
 * @Author: hegx
 * @Description:测试拥有性能监视能力的TestForumServiceImpl业务方法
 * @Date: 15:10 2017/7/16
 */
public class TestForumService {public static void main(String[] args) {ForumService forumService = new ForumServiceImpl();

        forumService.remove(10);
        forumService.create(new Forum());
    }}

程序执行的结果:



如上图和代码所示,当某个方法在进行性能监视,就必须调整方法的代码,在方法体前后分别添加上开启性能和结束性能监视的代码,这些非业务逻辑的性能监视代码破坏了ForumServiceImpl业务逻辑的纯碎性。我们希望通过代理的方式,将业务类方法中开启和结束性能的这些横切代码从业务类中完全移除。并通过JDK动态代理技术或CGLib动态代理技术奖横切代码动态织入到目标方法的位置。










这篇关于AOP理解——模拟带有横切逻辑的实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244575

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的