Java中的切面编程(AOP):理论与实践

news/2024/4/13 11:52:08/文章来源:https://blog.csdn.net/wenxuankeji/article/details/136544203

前言

面向切面编程(Aspect-Oriented Programming, AOP)是一种编程范式,它旨在增强传统面向对象编程(OOP)的能力,允许开发者将横切关注点(如日志、事务管理、权限检查等)从业务逻辑中分离出来,以达到模块化和解耦的目的。在Java世界中,Spring框架提供的AOP支持尤为广泛且易于集成。本文将深入剖析Java AOP的概念,并通过实例代码展示其实际应用。

一、核心概念

  1. 切面(Aspect)

    • 切面是封装了某种横切关注点的一段程序代码。它可以包含多个通知(Advice),并在特定连接点(Join Point)上织入(Weaving)到应用程序中。
  2. 通知(Advice)

    • 通知定义了何时及如何执行切面逻辑,比如:
      • Before Advice:在方法执行前触发;
      • After Advice:在方法正常执行后触发(无论是否抛出异常);
      • AfterReturning Advice:在方法成功执行并返回结果后触发;
      • AfterThrowing Advice:在方法抛出异常后触发;
      • Around Advice:环绕通知,包裹整个方法执行过程,在方法调用前后均有机会执行额外逻辑。
  3. 连接点(Join Point)

    • 在程序执行过程中能够插入切面的那些点,通常对应于方法调用、字段访问等。
  4. 切入点(Pointcut)

    • 定义了一组连接点集合的表达式,用来匹配应该应用通知的方法。
  5. 织入(Weaving)

    • 织入是指将切面应用到目标对象来创建新代理对象的过程。在Java中,可以通过编译期、加载期或运行期进行织入。

二、Spring AOP 实现

Spring AOP主要基于代理模式实现,它使用的是运行时动态代理机制(JDK动态代理或CGLIB代理)。下面是一个简单的Spring AOP切面示例,用于记录方法执行前后的日志:

// 导入相关注解
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.stereotype.Component;// 定义切面
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {// 方法执行前的日志记录System.out.println("Before method execution: " + joinPoint.getSignature().getName());}@After("execution(* com.example.service.*.*(..))")public void logAfter() {// 方法执行后的日志记录System.out.println("After method execution.");}@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")public void logAfterReturning(Object result) {// 方法成功执行并返回结果后的日志记录System.out.println("AfterReturning method execution with result: " + result);}
}

在这个例子中:

  • 我们定义了一个名为LoggingAspect的切面,通过@Aspect注解标记。
  • 使用@Before@After@AfterReturning注解声明了三个通知,分别在方法执行前、执行后以及成功返回后执行相应的逻辑。
  • 切入点表达式 "execution(* com.example.service.*.*(..))" 表示匹配com.example.service包下的所有类的所有方法。

三、配置与启用AOP

在Spring XML配置方式中,需要启用AOP并注册切面bean;在Java配置或注解驱动的Spring Boot应用中,由于默认启用了组件扫描,只要切面类被打上了@Component注解,Spring容器就会自动识别并处理。

四、进一步探索

除了简单的日志记录之外,AOP还能应用于更复杂的场景,如事务管理、权限验证、性能监控等。实际应用中,还可以结合注解自定义切面行为,让代码更加简洁且具有更好的可读性和可维护性。

总结而言,通过AOP,开发者能够更优雅地处理分散在代码各处的横切关注点,从而提高了软件的内聚性和可扩展性。随着对AOP理解的加深,你会发现它在复杂的企业级应用中扮演着不可或缺的角色。

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

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

相关文章

每日五道java面试题之springMVC篇(一)

目录: 第一题. 什么是Spring MVC?简单介绍下你对Spring MVC的理解?第二题. Spring MVC的优点第三题. Spring MVC的主要组件?第四题. 什么是DispatcherServlet?第五题. 什么是Spring MVC框架的控制器? 第一题. 什么是S…

链路负载均衡之全局选路策略

一、全局选路策略概念 当到达目的网络有多条等价路由或者缺省路由时,FW通过不同的智能选路方式动态选择最优链路。 二、全局选路策略的智能选路方式 为了满足不同的需求,华为FW支持四种智能选路方式,管理员可以根据设备和网络的实际情况进…

贪心 Leetcode 763 划分字母区间

划分字母区间 Leetcode 763 学习记录自代码随想录 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返…

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码,往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时,就会把内存中的数据先读出来,加载到cpu寄存器中,再去参与运算。 但是,关键是cpu读…

Stable Diffusion V3测评

1.引言 3月5号,Stability AI发布了介绍Stable Diffusion V3的研究论文,链接地址:戳我 这是目前他们发布的最先进、功能最强大的图像生成器,与一年多前发布的令人印象深刻的 Stable Diffusion V2.1 相比有了大幅升级。SD3所带来的…

分段线性化问题探析

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…

【贪心算法】专题练习二

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:题目解析 🌎推荐文章:【LeetCode】winter vacation training 目录 👉🏻买卖股票的最佳时机👉&…

数据解读乡村发展!专家详解 2024 年(第 17 届)中国大学生计算机设计大赛大数据主题赛赛题

2024 年(第 17 届)中国大学生计算机设计大赛大数据主题赛“数据解读乡村发展”赛题已于和鲸平台正式开赛,一月来,已有来自全国超百所高校的优秀本科生积极响应大赛号召完成报名。 为进一步使广大师生对于赛题主旨形成更清晰的认知…

lanqiao:合根植物

题目描述: 代码实现:

回收站选址(CCF 201912-2)解题思路

分析 把x,y坐标拼接成一个字符串(x,y)作为Set的key,保存到Set中,遍历Set,取出坐标,然后判断上下左右四个点是否在Set中,如果在,进而判断,四个角是否在Set中,…

[数据结构初阶]队列

鼠鼠我呀,今天写一个基于C语言关于队列的博客,如果有兴趣的读者老爷可以抽空看看,很希望的到各位老爷观点和点评捏! 在此今日,也祝各位小姐姐女生节快乐啊,愿笑容依旧灿烂如初阳,勇气与童真永不…

三范式与ER模型

三范式 概念: 三范式(3NF)是关系型数据库设计理论的基础,它确保数据的结构化和减少数据的冗余性。三范式由数学家E.F. Codd在1970年提出,作为关系理论的一部分。三范式包括: 第一范式(1NF&am…

Java引用传递及基本应用

在 Java 中,传递参数的方式主要有两种:值传递(传递的是对象的引用值)和引用传递。本教程将重点介绍 Java 中的引用传递以及其基本应用。 1. 引用传递概念 在 Java 中,所有的方法参数都是通过值传递的。对于对象类型的…

信号处理--卷积残差网络实现单通道脑电的睡眠分期监测

目录 背景 亮点 环境配置 数据 方法 结果 代码获取 参考文献 背景 人类大约花三分之一的时间睡觉,这使得监视睡眠成为幸福感的组成部分。 在本文中,提出了用于端到端睡眠阶段的34层深残留的Convnet架构 亮点 使用深度1D CNN残差架构&#xff0…

dolphinscheduler试用(一)(边用边修bug。。。。create tenant error)

(作者:陈玓玏) 前提:部署好了dolphinscheduler,部署篇见https://blog.csdn.net/weixin_39750084/article/details/136306890?spm1001.2014.3001.5501 官方文档见:https://dolphinscheduler.apache.org/…

python 蓝桥杯填空题

文章目录 字母数判断列名(进制问题)特殊日期大乘积星期几 字母数 由于是填空题,那么寻找的话,就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可 判断列名(进制问题) 这道题目,我们可…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。 注意:图中可能 存在负权回路…

滞销番茄变废为宝,成功打造市场份额第一番茄品牌|日本极致产品力

可果美是日本市场领先的番茄品牌,然而在可果美发展初期,番茄只是供应链中的滞销产品。可果美通过极致产品力的打造,将番茄“变废为宝”,打败亨氏、味好美成为可果美的招牌。可果美是如何做到的呢? 番茄是可果美供应链的滞销品 在…

2024年最新阿里云服务器地域选择方法,以及可用区说明

阿里云服务器地域和可用区怎么选择?地域是指云服务器所在物理数据中心的位置,地域选择就近选择,访客距离地域所在城市越近网络延迟越低,速度就越快;可用区是指同一个地域下,网络和电力相互独立的区域&#…

ps aux | grep xxxx和ps ef | grep xxxx这两个命令有什么区别

命令实例 ps aux | grep nexus和ps ef | grep nexus ps aux | grep nexus 和 ps ef | grep nexus 这两个命令都用于在 Unix 或 Linux 系统中查找与 nexus 相关的进程,但它们在展示进程信息时有细微的区别。 ps aux | grep nexus: ps aux 是一种显示系统上所有运行进…