详解 Java AOP:面向方面编程的核心概念与 Spring 实现

💥💥💥详解 Java AOP:面向方面编程的核心概念与 Spring 实现

Java 的 AOP(面向方面编程,Aspect-Oriented Programming)是一种编程范式,旨在通过将关注点(如日志记录、事务管理、权限控制等)分离出来,使其独立于业务逻辑代码,从而提高代码的可维护性和可重用性。AOP 的核心思想是横切关注点分离(Separation of Cross-cutting Concerns)。

👉AOP 的核心概念

1️⃣ 切面(Aspect):切面是关注点模块化的表现。它将横切关注点的行为封装在一起,比如日志切面、事务切面等。

2️⃣ 连接点(Join Point):程序执行过程中的某个点,比如方法调用或异常抛出。Spring AOP 仅支持方法级别的连接点。

3️⃣ 切入点(Pointcut):定义了一个或多个连接点,这些连接点是横切关注点所应用的地方。通过切入点表达式(如正则表达式)来指定。

4️⃣ 通知(Advice):定义了在特定连接点执行的动作。通知有五种类型:

  • 前置通知(Before):在方法执行之前执行。
  • 后置通知(After):在方法执行之后执行。
  • 返回通知(After Returning):在方法正常返回之后执行。
  • 异常通知(After Throwing):在方法抛出异常之后执行。
  • 环绕通知(Around):在方法执行之前和之后都执行,可以控制方法执行的前后逻辑。

5️⃣ 引入(Introduction):允许我们向现有的类添加新方法或属性。

6️⃣ 目标对象(Target Object):被一个或多个切面所通知的对象。

7️⃣ 织入(Weaving):将切面应用到目标对象以创建新的代理对象的过程。织入可以发生在编译时、类加载时和运行时。Spring AOP 采用的是运行时织入。

👉Spring AOP

Spring AOP 是 Spring Framework 的一个模块,它主要通过代理模式来实现 AOP 功能。Spring AOP 支持的主要代理方式有两种:

  • JDK 动态代理:基于接口的代理。如果目标对象实现了一个或多个接口,Spring AOP 就会使用 JDK 动态代理来创建代理对象。
  • CGLIB 代理:基于子类的代理。如果目标对象没有实现任何接口,Spring AOP 会使用 CGLIB 来生成目标对象的子类代理。

👉使用 Spring AOP 的步骤

1️⃣ 添加依赖
确保你的项目中包含 Spring AOP 相关的依赖。以下是 Maven 配置:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2️⃣ 定义切面类和通知方法
使用 @Aspect 注解定义一个切面类,并在其中定义通知方法。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logBeforeMethodExecution() {System.out.println("Method execution started.");}
}

3️⃣ 启用 AOP 功能
在 Spring Boot 应用程序类或配置类上添加 @EnableAspectJAutoProxy 注解。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@SpringBootApplication
@EnableAspectJAutoProxy
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

4️⃣定义切入点表达式
切入点表达式定义了通知应用的连接点。例如:

@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {}

🙋‍♀🧑‍🎤🌰示例

下面是一个简单的 Spring AOP 示例,包括一个切面和一个目标服务类。

// Service Class
package com.example.service;import org.springframework.stereotype.Service;@Service
public class UserService {public void createUser() {System.out.println("Creating a new user.");}
}// Aspect Class
package com.example.aspect;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.UserService.createUser(..))")public void logBeforeCreateUser() {System.out.println("Before creating user.");}
}// Main Application
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@SpringBootApplication
@EnableAspectJAutoProxy
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

结论

通过使用 AOP,开发者可以将横切关注点分离到独立的模块中,从而保持业务逻辑的清晰和代码的可维护性。Spring AOP 提供了一种简洁而强大的方式来实现 AOP,在实际开发中得到了广泛应用。

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

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

相关文章

最新微信发卡小程序 发卡网卡密系统流支持量主

2024.4更新 1.修复分类介绍报错 2.修改前端UI 3.增加插屏弹出广告 4.禁止PC端使用(PC端小程序没有广告) 免费下载&#xff1a;发卡小程序 卡密系统流支持量主 多种卡密领取模式【亲测】_麦田吧 前端演示地址&#xff1a;扫码查看 源码功能&#xff1a; 小程序系统/多种卡密领…

Excel单元格格式无法修改的原因与解决方法

Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法&#xff1a; 单元格或工作表被保护&#xff1a; 如果单元格或工作表被设置为只读或保护状态&#xff0c;您将无法更改其中的格式。解决方法&#xff1a;取消单元格或工作表的保护。在Excel中…

短信服务-短信平台

短信服务- 短信平台&#xff1a;连接你与世界的通信之桥 唤醒联系&#xff0c;瞬间沟通 携着信息纵横的现今社会&#xff0c;短信服务-短信平台无疑成为人们快捷高效进行沟通的不二之选。无论是商务联系、个人信息传递&#xff0c;还是市场推广&#xff0c;优质的短信平台都为…

LLC开关电源开发:第一节,LLC原理概述

第一节&#xff0c;LLC原理概述文章目录 一、LLC概述二、LLC电路拓扑1.电路拓扑2.电路工作原理3.电路原理分析 总结 一、LLC概述 LLC电路&#xff0c;是一种通过控制开关频率&#xff08;频率调节&#xff09;来实现输出电压恒定的谐振电路&#xff0c;它包括一个电感L、一个电…

001 仿muduo库实现高性能服务器组件_项目简介

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 一、项目简介二、所需知识储备三、什么是muduo四、Reactor模式单Reactor单线程&#xff1a;单I/O多路复⽤业务…

Tomcat 面试题(一)

1. 简述什么是Tomcat &#xff1f; Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP)技术&#xff0c;提供了一个运行Java Web应用程序的平台。Tomcat由Apache软件基金会维护&#xff0c;并广泛用于开发和部署Web应用程序。 Tom…

C语言-02_变量与进制

文章目录 1.关键字2.标识符3.变量3.1 变量的声明与赋值3.2 变量的作用域3.3 变量按类型的分类 4.基本数据类型4.1 整数类型4.1.1 类型说明4.1.2 举例4.1.3 后缀4.1.4 整型的极限值 4.2 浮点类型4.2.1 类型说明4.2.2 举例 4.3 字符类型4.4 布尔类型 5.变量间的运算规则5.1 隐式类…

K8s证书过期处理

问题描述 本地有一个1master2worker的k8s集群&#xff0c;今天启动VMware虚拟机之后发现api-server没有起来&#xff0c;docker一直退出&#xff0c;这个集群是使用kubeadm安装的。 于是kubectl logs查看了日志&#xff0c;发现证书过期了 解决方案&#xff1a; 查看证书 #…

python数据处理中的类型检查与转换技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、类型检查的重要性 二、类型检查与转换技巧 1. 识别数据类型不一致 2. 使用astype()方…

C语言网络编程:深入探索与实战应用

C语言网络编程&#xff1a;深入探索与实战应用 在数字化时代的浪潮中&#xff0c;网络编程已成为一项不可或缺的技能。C语言作为一种历史悠久且功能强大的编程语言&#xff0c;其在网络编程领域的应用尤为广泛。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深…

Epic Pen Pro v3 解锁版安装教程 (屏幕实时标记注释工具)

前言 Epic Pen是一款功能强大的屏幕标记工具&#xff0c;允许您在屏幕上绘图或书写&#xff0c;而无需在后台与软件交互。这意味着您几乎可以注释任何东西&#xff01;使用我们流行的屏幕标记和Windows数字白板工具Epic Pen编写、绘制和突出显示&#xff0c;包括演示文稿软件&…

ClickHouse数据管理与同步的关键技术

2024年 5 月 18 日&#xff0c;ClickHouse官方首届杭州 Meetup 活动成功举行。本次活动由 ClickHouse 和阿里云主办&#xff0c;NineData 和云数据库技术社区协办。围绕ClickHouse的核心技术、应用案例、最佳实践、数据管理、以及迁移同步等方面&#xff0c;和行业专家展开交流…

idea中快速找到当前git地址

idea中快速找到当前git地址 然后双击就可以看到地址了

Linux漏洞SSL/TLS协议信息泄露漏洞(CVE-2016-2183) - 非常危险(7.5分) 解决办法!升级openssl

漏洞情况 详细描述 TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及 Triple 3DES存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过Sweet32攻击&…

2023-2024中国区块链年度发展报告

来源&#xff1a;赛迪 近期历史回顾&#xff1a;2024社交媒体全球使用趋势报告.pdf 国际建造成本指数报告2024--产能角逐.pdf 2024可持续包装管理体系与最佳实践案例集.pdf 2024年专利诉讼报告.pdf 2024Q1保险业运行报告.pdf 2024年云指数报告.pdf 2024内容营销10大趋势-内容时…

pytorch-池化层

目录 1. pooling池化层1.1 down sample2.2 Max pooling1.3 Avg pooling1.3 pooling pytorch实现 2. up sample上采样2.1 up sample2.2 pytorch实现 3. ReLU 1. pooling池化层 1.1 down sample 见下图&#xff0c;隔行隔列采样 2.2 Max pooling 下图采用2x2的filter&#x…

np.savetxt保存数据时不使用科学计数法形式,保留原数据

import numpy as npdata np.array([[1.2345, 6.78901, 2.34567]]) np.savetxt(./data1.txt, data) 上面的代码输出为 1.234499999999999931e00 6.789010000000000211e00 2.345670000000000144e00 未指定存储格式&#xff0c;会默认使用科学计数法进行存储。 使用fmt参数可以…

拉格朗日插值法的推导

1、插值的基本定义   设函数 y f ( x ) yf(x) yf(x)在区间 [ a , b ] [a,b] [a,b]上有定义&#xff0c;且已知它在 n 1 n1 n1个互异点 a ≤ x 0 < x 1 < . . . < x n ≤ b a\leq x_0<x_1<...<x_n\leq b a≤x0​<x1​<...<xn​≤b上的函数值 y 0 …

mysql-通过binlog日志复制主从同步

主从复制binlog日志方式 量大的时候使用GTID效率更高&#xff0c;维护起来比较麻烦 有了主从同步也要做备份(双保险&#xff0c;本地有一份&#xff0c;主从同步也有一份 ) 1、准备环境两台机器&#xff0c;关闭防火墙和selinux。---两台机器环境必须一致。时间也得一致 10.…

【Unity脚本】Unity中如何按类型查找游戏对象(GameObject)

【知识链】Unity -> 脚本系统 -> 访问游戏对象 -> 按类型访问游戏对象摘要&#xff1a;本文介绍了Unity中按类型查找游戏对象&#xff08;GameObject&#xff09;的五种方法&#xff0c;并提出了使用这些方法的最佳实践。 本文目录 一、访问游戏对象的方法二、如何按…