AOP编程

AOP编程

AOP,面向切面编程,一种编程范式,指导开发者如何组织程序结构。

OOP,面向对象编程,一种编程思想。

AOP,提供了一种机制,可以将一些横切系统中多个模块的共同逻辑(如日志记录、事务管理、安全控制等)从代码中分离出来,以提高模块的内聚性和可重用性。

AOP核心概念

  • 横切关注点:对哪些方法进行拦截,拦截后又如何处理,这些就是横切关注点。
  • 通知Advice:在特定的切入点上进行更强的处理。
  • 连接点JointPoint:程序执行过程中能应用切面的具体位置。
  • 切入点PointCut:定义在切面在哪些连接点上应用。
  • 切面Aspect:定义了切入点和通知,实现横切关注点的模块。

AOP切入点表达式

简单举个例子:

这个表达式包含以下匹配条件:

执行方法签名: 返回类型为任意类型(*)、方法名以"save"开头、参数类型为"com.example.entity.User

类或包匹配: 类名属于"com.example"包下的任意类

访问修饰符: public

AOP编程实践

        简单写一个用户服务模块的登录接口来实践AOP编程。

LoggingAspect 类:

  • 用 @Aspect 注解标记,表明这是一个切面类。
  • @Component 注解自动将这个类作为 Spring 管理的 Bean。
  • 定义了一个切点 handleMethod(),它匹配 com.example.service 包及其子包中所有以handle 开头的方法。

定义了三种通知:

  • @Before:在匹配的切点方法执行前执行。
  • @After:在匹配的切点方法执行后执行。
  • @Around:环绕匹配的切点方法执行,可以控制何时执行目标方法。

@Aspect
@Component
public class LoggingAspect {

    // 定义一个切点,匹配所有以"handle"开头的方法
    @Pointcut("execution(* com.example.service.*.handle*(..))")
    private void handleMethod() {}

    // 前置通知
    @Before("handleMethod()")
    public void beforeHandleMethod() {
        System.out.println("Before handling method");
    }

    // 后置通知
    @After("handleMethod()")
    public void afterHandleMethod() {
        System.out.println("After handling method");
    }

    // 环绕通知
    @Around("handleMethod()")
    public void aroundHandleMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before method execution");
        joinPoint.proceed(); // 执行目标方法
        System.out.println("After method execution");
    }
}

AppConfig 类:

  • 使用 @Configuration 注解,表示这是一个 Spring 配置类。
  • @EnableAspectJAutoProxy 开启了对 AspectJ 的支持,允许使用 AOP。
  • @ComponentScan(“com.example”)指定了 Spring 进行组件扫描的包路径。
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.example")
public class AppConfig {

}

Userservice 类:

  • 使用 @Service 注解标记,表明这是一个服务组件,并自动注册为 Spring 管理的 Bean。
  • handleLogin 方法是业务逻辑方法,它会被 AOP 切面所通知。
@Service
public class UserService {

    public void handleLogin(String username, String password) {
        // 登录逻辑
        System.out.println("UserService.handleLogin");
    }
}

Application 类:

  • 主入口,用于启动 Spring 应用上下文并执行业务逻辑。
public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService =(UserService)context.getBean("userService");
        userService.handleLogin("admin", "123456");
    }
}

运行结果如下:

AOP编程的好处

  • 关注点分离:将业务逻辑与系统级服务(如日志记录、事务管理、安全性等)分离,使得代码更加清晰和模块化。
  • 提高代码复用性:横切关注点可以在多个地方复用,而无需在每个业务逻辑中重复编写。
  • 增强代码可维护性:当需要修改横切关注点时,只需在一个地方进行修改,而不必修改每个业务逻辑组件。
  • 减少代码重复:避免在多个类或方法中重复相同的代码,例如日志记录或事务处理。
  • 提高开发效率:开发者可以专注于业务逻辑的实现,而不必关心底层的横切关注点。
  • 动态行为织入:可以在不修改原始代码的情况下,动态地添加或修改方法的行为,提高软件的灵活性。
  • 更好的代码组织:通过切面和切点,可以更好地组织和管理代码,使得系统结构更加合理。
  • 易于扩展:新的横切关注点可以轻松地加入到现有系统中,而不影响现有业务逻辑。

总结:

        AOP编程以其独特的优势,在现代软件开发中扮演着至关重要的角色。它通过将横切关注点从业务逻辑中解耦,不仅提升了代码的整洁度和可维护性,还极大地增强了代码的可复用性和扩展性。随着企业应用的复杂性不断增加,AOP提供了一种优雅且高效的解决方案,使得开发者能够更加专注于解决业务问题,而不是被底层的通用问题所困扰。因此,AOP不仅是一种编程技术,更是一种提高软件开发质量和效率的策略。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL面试题练习 —— 波峰波谷

来源:字节今日头条 目录 1 题目2 建表语句3 题解 1 题目 有如下数据,记录每天每只股票的收盘价格,请查出每只股票的波峰和波谷的日期和价格; 波峰定义:股票价格高于前一天和后一天价格时为波峰 波谷定义:股…

MoE 系列论文解读:Gshard、FastMoE、Tutel、MegaBlocks 等

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

Unity在Windows平台播放HEVC/H.265格式视频的底层原理

相关术语、概念 HEVC/H.265 HEVC(High Efficiency Video Coding)是一种视频压缩标准,也被称为H.265。它是一种高效的视频编码标准,可以提供比之前的标准(如H.264)更高的压缩率,同时保持较高的…

力扣HOT100 - 31. 下一个排列

解题思路: 数字是逐步增大的 步骤如下: class Solution {public void nextPermutation(int[] nums) {int i nums.length - 2;while (i > 0 && nums[i] > nums[i 1]) i--;if (i > 0) {int j nums.length - 1;while (j > 0 &&…

015_表驱动编程思想(c实现)

【背景】 数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。 ——Rob Pike 上面是这个名人说过的话,那么c语言之父 丹尼斯麦卡利斯泰尔里奇 的《c程序设计》里曾经…

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…

C# 利用Xejen框架源码,我们来开发一个基于Dapper技术的数据库通用的帮助访问类,通过Dapper的增删改查,可以访问Sqlite数据库

Dapper 是一个轻量级的对象关系映射(ORM)工具,适用于 .NET 平台。它由 Stack Overflow 团队开发,旨在提供简单、高效的数据访问功能。与其他重量级 ORM(如 Entity Framework)相比,Dapper 更加轻…

用这8种方法在海外媒体推广发稿平台上获得突破-华媒舍

在今天的数字时代,海外媒体推广发稿平台已经成为了许多机构和个人宣传和推广的有效途径。如何在这些平台上获得突破并吸引更多的关注是一个关键问题。本文将介绍8种方法,帮助您在海外媒体推广发稿平台上实现突破。 1. 确定目标受众 在开始使用海外媒体推…

C++语法|虚函数与多态详细讲解(六)|如何解释多态?(面试向)

系列汇总讲解,请移步: C语法|虚函数与多态详细讲解系列(包含多重继承内容) 多态分为了两种,一种是静态的多态,一种是动态的多态。 静态(编译时期)的多态 函数重载 boo…

pands使用openpyxl引擎实现EXCEL条件格式

通过python的openpyxl库,实现公式条件格式。 实现内容:D列单元格不等于E列同行单元格时标红。 #重点是formula后面的公式不需要“”号。 from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles.differential import Dif…

【设计模式】JAVA Design Patterns——Bytecode(字节码模式)

🔍目的 允许编码行为作为虚拟机的指令 🔍解释 真实世界例子 一个团队正在开发一款新的巫师对战游戏。巫师的行为需要经过精心的调整和上百次的游玩测试。每次当游戏设计师想改变巫师行为时都让程序员去修改代码这是不妥的,所以巫师行为以数据…

git push后一直卡在在Writing objects:问题

git push后一直卡在Writing objects: 解决:设置 git config --global http.postBuffer 5242880000在执行git push。 一般设置后就可以成功了,后面不用看。 2. 我这里结果又报错: fatal: protocol error: bad line length 8192 MiB | 107.46 …

【C++】d1

关键字&#xff1a; 运行、前缀、输入输出、换行 运行f10 前缀必须项&#xff1a; #include <iostream> using namespace std; 输入/输出&#xff1a; cin >> 输入 cout << 输出 语句通过>>或<<分开 换行 endl或者"\n"

想当安卓开发工程师?学习路线分享!

安卓开发学习路线 在前几篇文章中,对安卓开发岗位的岗位要求做了一些科普,本节文章将介绍安卓开发岗位的学习路线。 目前,网络上有很多面经、算法题解、算法课等学习资料,如何合理利用这些资料成为技术求职者的一大困惑。笔者整理了一份安卓开发岗位学习路线供大家参考,…

第四课 communcation服务-can配置第二弹

Davinci配置目标: 介绍DBC基本属性,并且配置出一个DBC。 将DBC导入到vector的davinci工具,生成我们想要的代码。 Davinci配置步骤: 1. 编辑DBC文件 DBC文件是一种非常重要的工具,所谓DBC就是Database CAN,CAN网络的数据库文件,定义了CAN网络的节点、消息、信号的所有…

网络安全知识核心20要点

1、什么是SQL注入攻击 概述 攻击者在 HTTP 请求中注入恶意的 SQL 代码&#xff0c;服务器使用参数构建数据库 SQL 命令时&#xff0c;恶意SQL 被一起构造&#xff0c;并在数据库中执行。 注入方法 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码‘ or ‘1’’…

axios如何传递数组作为参数,后端又如何接收呢????

前端的参数是一个数组。 前端编写&#xff1a; 后端接收&#xff1a;

git解决版本冲突 -git pull

当在Git中遇到版本冲突时&#xff0c;通常是因为两个或更多的开发者在同一时间修改了同一个文件的相同部分&#xff0c;并将这些修改推送到远程仓库。Git无法自动合并这些修改&#xff0c;因此会产生冲突。以下是解决Git版本冲突的基本步骤&#xff1a; 拉取最新代码&#xff…

mybatis-plus 优雅的写service接口中方法(3)

多表联查 上文讲过了自定义sql &#xff0c;和wrapper的使用&#xff0c;但是我们可以发现 我们查询的都是数据库中的一张表&#xff0c;那么怎么进行多表联查呢&#xff0c;当然也是用自定义sql来进行实现 比如说 查询 id 为 1 2 4 的用户 并且 地址在北京 的 用户名称 普…