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不仅是一种编程技术,更是一种提高软件开发质量和效率的策略。

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

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

相关文章

WordPress搭建流程

1. 简介 WordPress 是一个 PHP 编写的网站制作平台。WordPress 本身免费,并且拥有众多的主题可以使用,适合用于搭建个人博客、公司官网、独立站等。 2. 环境准备 2.1 WordPress 下载 WordPress 可以在 Worpress中文官网 下载(如果后续要将后台调成中文的话,一定要从中文…

定时器

文章目录 11.11.21.31.41.5 22.12.2 基本定时器 框图2.32.42.4.12.4.22.4.32.4.42.4.52.4.6 2.5 定时器 溢出时间计算方法2.6 定时器 中断 实验配置步骤2.72.7.12.7.2 和42.7.32.7.52.7.6 33.13.23.2.1 时钟源3.2.23.2.43.2.6 3.33.43.4.13.4.23.4.33.4.43.4.53.4.5.13.4.5.23.…

机器学习实验------Adaboost算法

第1关:什么是集成学习 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 第2关: Boosting 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 第3关:Adaboost算法流程 任务描述 本关任务:用Python实现Adaboost,并通过鸢尾花数据集…

捕食者优化算法,原理详解,MATLAB代码免费获取

捕食者优化算法(Hunter–prey optimization,HPO)是一种受自然启发的群智能优化算法。该算法的灵感来自于捕食动物(如狮子、豹和狼)以及猎物(如雄鹿和瞪羚)的行为。动物狩猎行为有很多场景,其中一些场景已经转化为优化算法。本文使…

如何选择一款安全高效的数据自动同步工具?

随着科技的不断发展,企业处理的数据量愈发庞大。数字化浪潮的涌现使得数据在业务活动和决策中的角色变得日益重要,然而这些数据往往分布在不同的位置,需要进行同步和分类,以便更有效地利用。以下是一些常见的数据自动同步场景&…

UE5 像素流web 交互2

进来点个关注不迷路谢谢! ue 像素流交互多参数匹配 主要运用像素流的解析json 状态: 测试结果: 浏览器控制台: 接下来编写事件传递 关注下吧!

模板编译之入口分析

Vue 是一个渐进式 JavaScript 框架,提供了简单易用的模板语法,帮助开发者以声明式的方式构建用户界面。Vue 的模板编译原理是其核心之一,它将模板字符串编译成渲染函数,并在运行时高效地更新 DOM。本文将深入探讨 Vue 模板编译的原…

【机器学习300问】96、怎么理解卷积神经网络CNN中的卷积操作?

卷积操作是卷积神经网络(CNN)中的一种核心组件。要讲清楚卷积操作,我们只需要回答以下四个问题:什么是卷积核?卷积运算的规则是什么?padding是什么?stride是什么? 下面让我以图像处理…

27寸2K显示器 - HKC G27H2

HKC G27H2是一款面向电竞市场的高性能显示器,以其2K分辨率和180Hz的刷新率作为主要卖点,旨在为玩家提供流畅而清晰的视觉体验。配备HDR 400技术和95% DCI-P3色域覆盖,这款显示器还支持升降旋转支架,为用户提供了高度的人体工程学适…

阿尔杰姆·卢金采访

近年来,在中俄两国元首亲自擘画、战略引领下,两国新时代全面战略协作伙伴关系成熟坚韧、稳如泰山,树立了新型大国关系的新范式。中俄关系走出了一条大国战略互信、邻里友好的相处之道,给两国人民带来了实实在在的好处,…

Python爬虫:爬取B站视频(最新、能用且讲解详细)【01】

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️如遇文章付费,可先看…

Android Notes

maven 版本发布 1、小于 AGP7 使用 maven 插件 apply plugin: maven uploadArchives {repositories {mavenDeployer {pom.groupId GROUP_IDpom.artifactId ARTIFACT_IDpom.version VERSION//正式版本repository(url: RELEASE_URL) {authentication(userName: userName, p…

世界上首位AI程序员诞生,AI将成为人类的对手吗?

3月13日,世界上第一位AI程序员Devin诞生,不仅能自主学习新技术,自己改Bug,甚至还能训练和微调自己的AI模型,表现已然远超GPT-4等“顶流选手”。 AI的学习速度如此之快,人类的教育能否跟上“机器学习”的速…

SQLServer表变量

表变量是本地变量的一种特殊类型,它有助于临时存储数据; 要声明表变量,使用declare,而局部变量的名称必须以符号开头; TABLE关键字指定此变量是表变量,然后还要定义列名和数据类型; 下面定义一个表变量&#xff0c…

嵌入式全栈开发学习笔记---C语言笔试复习大全21(编程题25~30)

目录 25、实现字符串的排序。(输入hello world good,输出good hello world,其中字符串个数任意) 26、输入两个有序的字符串(从小到大),合并成一个有序的字符串。(输入cdhxyz fjln …

1076: 判断给定有向图是否存在回路

解法&#xff1a; 直观的方法用邻接矩阵dfs,这是错误的代码 #include<iostream> #include<vector> using namespace std; int arr[100][100]; int f 0; void dfs(vector<int>& a, int u) {a[u] 1;for (int i 0; i < a.size(); i) {if (arr[u][i]…

2024 一键批量下载微博内容/图片/视频/评论/转发数据,导出excel和pdf

以李健的微博为例&#xff0c;抓取2010-2024年所有的微博数据excel&#xff0c;包含微博链接&#xff0c;微博内容&#xff0c;发布时间&#xff0c;点赞数&#xff0c;转发数&#xff0c;评论数&#xff0c;话题等。 每个月的微博转评赞总数曲线&#xff0c;2015年是高峰。 微…

Centos7静态路由和动态路由

路由&#xff0c;即路由选择&#xff08;Routing&#xff09;&#xff0c;是指在计算机网络中选择数据传输路径的过程。路由器&#xff08;Router&#xff09;是执行路由选择功能的网络设备。路由的主要目的是在复杂的网络结构中&#xff0c;选择最佳路径将数据包从源节点传递到…

自回归模型(二):具有自回归误差的回归

让我们考虑一个问题&#xff0c;其中我们有一个y变量和多个x变量&#xff0c;它们都被测量为时间序列。举个例子&#xff0c;我们可以将y设定为高速公路上每月的事故数量&#xff0c;而x则表示每月在高速公路上的交通量&#xff0c;观测时间为连续的120个月。一个多元&#xff…

使用 MPI 做 3D 带状矩阵的转置

目的&#xff1a;整个大矩阵从 [Nx, Ny, Nz] 转到 [Nz, Nx, Ny] 每个进程的输入&#xff1a;大矩阵的 [Nx / total_proc_num, Ny, Nz] 的部分 每个进程的输出&#xff1a;大矩阵的 [Nz / total_proc_num, Nx, Ny] 的部分 一开始我大概有一个想法&#xff0c;假设两个进程的话…