「Spring 学习笔记 (十一)」基于注解的 Spring AOP

深入掌握基于注解的Spring AOP实现 面向切面编程(AOP)是软件开发中的一个重要概念,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,以便在系统的多个部分中复用。这些横切关注点包括日志记录、事务管理、安全性和缓存等。面向切面编程(AOP)是一种编程范式,它允许开发者将横切关注点(如日志、事务管理等)与业务逻辑分离。在Spring框架中,AOP主要用于将业务逻辑中散布在多个点的公共行为(如安全、事务等)模块化,以减少代码重复,提高模块的内聚性。 阅读详情

写在前面:kissing_heart:

大一电子信息工程新生,请多多关照,希望能在 InfoQ 社区 记录 自己的学习历程!

【Spring 学习笔记】系列教程基于 Spring 5.2.10.RELEASE 讲解。

一、AOP 简介

前面说过, Spring 的核心思想就是 IoC 和 AOP ,有关 IoC 的内容已经介绍过一部分了,接下来就来讲下 Spring 另一大重点: AOP 。

1、什么是 AOP

AOP ,“ Aspect Oriented Programming ”,译为“ 面向切面编程 ”,和 OOP(面向对象编程)类似, 它也是一种编程思想 。

2、AOP 的作用(特点)

代理模式

Spring AOP 的实现原理是 代理模式 ,AOP 的作用是 通过代理类为原始类增加一些额外功能 :如日志管理、权限管理、事务管理、异常管理等一些 非业务性功能 。

无入侵式

与传统的公共方法不同,Spring AOP 并不是直接调用的,AOP 是通过 横向的抽取机制 实现的。它将一些 非业务的通用功能 抽取出来单独维护,并 通过配置文件或注解的形式定义这些功能 要以哪种方式作用在哪个模块中,可以在无须修改任何业务代码的基础上完成对这些通用功能的调用和修改,即 无入侵式 的。

解耦合

事务与非事务功能分离,Spring AOP 还减少代码的重复,让我们更专注于专注业务逻辑代码。

3、AOP 相关的专业术语

4、AOP 框架

目前最流行的 AOP 实现(框架)主要有两个,分别为 Spring AOP 和 AspectJ 。

  • 注:一般这两个框架一起整合使用。

二、AOP 入门案例

SpringAOP 的开发有两种方式,XML 和 注解, 本篇文章及之后的教程都 使用注解开发 演示.

1、添加 AOP 依赖

在 pom.xml 文件里添加 Spring AOP 和 AspectJ 的 jar 包依赖

  • Spring AOP使用纯 Java 实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。
  • AspectJ是一个基于 Java 语言的 AOP 框架。从 Spring2.0 开始,Spring AOP 引入对 Aspect 的支持,AspectJ 扩展了 Java 语言,提供了一个专门的编译器,在编译时提供横向代码的织入。
<dependencies>
    <!--包含Spring AOP:有基本的AOP功能-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <!--AspectJ框架有更强大的AOP功能-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>
</dependencies>

复制代码

可以看到 spring-context 中已经导入了 spring-aop ,所以不需要再单独导入 spring-aop

2、创建目标接口和实现类

目标接口和实现类就是所谓的 Target(目标),即要被代理的对象。

/*UserDao接口*/
public interface UserDao {
    public void add();
    public void delete();
    public void update();
    public void select();
}
/*UserDaoImpl实现类*/
@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("正在执行 UserDao 的 add 方法");
    }
    @Override
    public void delete() {
        System.out.println("正在执行 UserDao 的 delete 方法");
    }
    @Override
    public void update() {
        System.out.println("正在执行 UserDao 的 update 方法");
    }
    @Override
    public void select() {
        System.out.println("正在执行 UserDao 的 select 方法");
    }
}

复制代码

3、创建切面类(通知类)

3.1 定义切面 @Aspect

通过 @Aspect 注解将一个 Bean 定义为切面。

@Component//将这个类定义成 Bean
@Aspect//将这个Bean定义为切面
public class MyAdvice {
}

复制代码

3.2 定义切点 @Pointcut

在 AspectJ 中,我们可以使用 @Pointcut 注解用来定义一个切点。

//切点方法必须是private,无返回值,无参数
@Pointcut(value ="execution(* com.bighorn.*.*Dao.*(..))")
private void pointCut() {
}

复制代码

注意:

  • 定义为切点的方法是一个无意义的 private 方法 ,即无参数、无返回值(void)、无方法体
  • @Pointcut 注解中有一个 value 属性,这个属性的值就是 切入点表达式 (插个眼在这,下篇文章详细嗦嗦)

3.3 定义通知

**通知(Advice)**就是将共性功能抽取出来后形成的方法,即对切入点增强的内容

通知有很多类型:前置通知、后置通知、环绕通知、异常通知、返回通知。(插个眼在这,下篇文章详细嗦嗦)

通知注解中有一个 value 属性,value 属性的取值就是这些 通知(Advice) 所要 织入(Weaving) 的 切点(PointCut) ,它既可以是切入点表达式,也可以是切入点引用(切入点对应的方法名称)

//使用切入点引用
@Before("MyAdvice.pointCut()")
public void beforeAdvice() {
    System.out.println("这是前置通知……");
}
//使用切入点表达式
@After(value ="execution(* com.bighorn.*.*Dao.*(..))")
public void afterAdvice(){
    System.out.println("这是后置通知……");
}

复制代码

3.4 切面类完整代码

/*切面类(通知类)*/
@Component//将这个类定义成 Bean
@Aspect//将这个Bean定义为切面
public class MyAdvice {
    //切点方法必须是private,无返回值,无参数
    @Pointcut(value = "execution(* com.bighorn.*.*Dao.*(..))")
    private void pointCut() {
    }


    //使用切入点引用
    @Before("MyAdvice.pointCut()")
    public void beforeAdvice() {
        System.out.println("这是前置通知……");
    }
    //使用切入点表达式
    @After(value ="execution(* com.bighorn.*.*Dao.*(..))")
    public void afterAdvice(){
        System.out.println("这是后置通知……");
    }
}

复制代码

4、启用 @AspectJ 注解支持

在 Spring 的配置类中 使用@AspectJ 注解 , 开启 AspectJ 的自动代理 ,使用 @ComponentScan 注解开启注解扫描。

/*Spring核心配置类*/
@Configuration
@ComponentScan("com.bighorn") //开启注解扫描
@EnableAspectJAutoProxy //开启 AspectJ 的自动代理
public class SpringConfig {
}

复制代码

5、编写运行程序

public static void main(String[] args) throws SQLException {
    //获取配置类初始化容器
    ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    //从容器中获取UserDao对象
    UserDao userDao = context.getBean(UserDao.class);
    //调用userDao的方法
    userDao.add();
    userDao.delete();
    userDao.update();
    userDao.select();
}

复制代码

运行结果如下,可以发现对每个方法都进行的加强:前置通知和后置通知

写在后面:beers:

感谢观看啦

有什么不足,欢迎指出哦

Spring 4 AOP与@Aspect注解深入解析 Aspect要定义一个切入点以匹配特定方法,您可以按照以下步骤操作:指定返回类型,如表示匹配返回类型为任意的方法。指定方法名称,如表示匹配所有名为method的方法。使用通配符来匹配任意类型的参数,如表示匹配任意方法。如果需要匹配特定类型的参数,可以指定参数类型,如表示匹配所有接受一个String和一个int类型参数的方法。代码示例:@Aspect@Component在这个例子中,切入点将匹配包中所有类的所有方法。@Before。 阅读详情

相关推荐

Spring AOP依赖jar包

Spring中基于AOP开发的项目依赖jar包

spring AOP依赖配置大全

pom.xml文件的依赖配置 <dependencies> <!--junit单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <versio...

qq_44534541的博客 1万+

spring AOP依赖三个jar包

spring做AOP开发所依赖的三个jar包 aopalliance-1.0.jar aspectjweaver-1.7.0.jar spring-aspects-4.0.2.RELEASE.jar

Spring AOP依赖包

Spring4和2.5发生了很大的变化,原来的spring2.5很多倚赖的jar包都是随着spring一起发布的,现在spring4已 经不再发布倚赖包,需要你自己去导入 1.org.springframework.aop-4.RELEASE 这个是spring的 AOP编程必备包 2.cglib-nodep-2.1_3 3.aspectjweaver-1.6.2 ...

weixin_30693683的博客 1万+

Spring Aop四个依赖的Jar包

Spring Aop四个依赖的Jar包

spring aop依赖jar包

springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足

13-spring aop 配置详解

一、aop相关依赖 要使用spring的aop功能需要导入如下依赖(理论上只需要导入aop和aspects就行了,但是如果只有aop和aspects可以使用aop的基本功能,但是此时只能代理接口,所以还需要导入外部依赖) <!--spring aop相关 --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop --> <dependency> <groupId

SO 608

用Cursor+Node.js零代码搭建健康数据仪表盘:从数据录入到可视化全流程

本文详细介绍了如何利用Cursor AI编程助手和Node.js,无需手动编写代码,即可构建个人健康数据仪表盘的全流程。通过自然语言指令,实现从数据录入、存储到动态图表可视化的完整系统,展示了AI驱动开发在降低技术门槛、提升开发效率方面的强大能力。

gitlab7runner的博客 700

springboot引入AOP

AOP是Aspect Oriented Programming的缩写,意为面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是spring框架的一个重要内容,她通过对既有程序定义一个切入点(pointcut),然后在切入点前后切入不同的执行任务,常见使用场景有:打开/关闭数据库连接、打开/关闭事物、记录日志等等。基于AOP不会破坏原来的程序逻辑,因此她可以很好地对...

weixin_34174422的博客 602

Aloudata Agent :基于 NoETL 明细语义层的分析决策智能体

这是包括我们在内的一些厂商探索的一个新方向,这种方式先由大模型将自然语言转化为对指标语义层的查询请求(MQL,Metrics Query Language),再由指标平台将指标和维度的查询与计算逻辑转化为准确的 SQL 查询语句。用户查询经大模型语义解析后,将其转换为指标、维度及筛选条件的组合表达,并生成面向指标平台的 MQL,Aloudata CAN 指标平台的语义引擎将 MQL 转换为准确和可执行的查询 SQL,语义引擎内置函数体系与 SQL 解析器,确保语义转换的 100% 准确性。

Aloudata的博客 1664

Python爬取腾讯视频m3u8加密流实战(附完整代码)

本文提供了一份详细的Python实战教程,指导如何通过抓包分析、模拟请求头与载荷,破解腾讯视频的m3u8加密流防盗链机制,并附上完整代码实现视频片段的下载与合并。教程涵盖从侦察到代码实现的完整流程,并包含参数动态化、多线程下载等高级技巧与避坑指南,旨在帮助开发者掌握流媒体下载的核心技术。

weixin_29090089的博客 1633

【JavaEE】Spring AOP的注解实现

基于注解@annotation 和 execution 的方式实现SPring AOP

yj20040627的博客 1万+

2025年12月11日 Coherent收发器下沉到数据中心:调研

技术可行性已基本具备。随着3nm DSP技术的成熟和Coherent-Lite等低功耗方案的推出,Coherent技术与IMDD的功耗差距在800G及以上速率节点快速缩小。特别是在1.6T及更高速率,两种技术的功耗开始趋于收敛。同时,通过系统级优化,如将DSP功能从可插拔模块转移到ASIC芯片,可实现30%以上的功耗降低。在成本方面,硅光技术的进步使得单通道硅光引擎BOM成本降至18美元,较2020年下降62%,逼近InP方案的经济临界点。光学系统机会丰富多样。

weixin_51184047的博客 1168

Spring高手之路19——Spring AOP注解指南

在本文中,我们将深入探索Spring AOP(面向切面编程)的核心概念及其在现代Spring应用中的实际应用。从基本的注解使用到复杂的切面配置,本文将一步步指导你如何利用Spring AOP提升代码的模块化,帮助你在Spring开发路上更进一步。

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 1万+

Excel地理探测器实战:5分钟搞定空间分异性分析(附完整数据集)

本文详细介绍了如何使用Excel地理探测器插件进行空间分异性分析。通过5分钟实战教程,手把手指导数据格式准备、软件操作及四大探测器(分异及因子、交互作用、风险区、生态探测器)的结果解读,帮助规划师、研究者快速验证地理因素对现象分布的影响,大幅降低GIS分析门槛。

peace的博客 608

VS2022离线环境下的NuGet包管理:从本地源到依赖项全解析

本文详细解析了在VS2022离线环境下如何高效管理NuGet包,包括搭建本地NuGet源的两种方案(本地文件夹源和私有NuGet服务器)、获取离线包的三大渠道以及依赖项处理的实战技巧。通过自动化脚本和依赖树分析工具,帮助开发者解决离线环境中的依赖项黑洞问题,提升开发效率。

5f4d3s2a1q的博客 1061

Spring之AOP注解开发

Spring之AOP注解开发

楠黎倾风的博客 1万+

Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (一)

先把这连个都添加到场景中,然后把kinect的depth相机拖到vision sensor中,把kinect的script也拖到vision sensor中,同时要注意修改深度相机的坐标,及修改script,删掉/rgb部分。由于需要导入到仿真场景中PDF文件不能直接导入,所以需要生成图下文件,使用windows自带的画图工具,生成以厘米为单位的图像格式,大小和标定板的设置大小一直。可以生成需要用的标定板的文件,设置标定板的大小,棋盘格的大小,等相关的参数,之后可以保存PDF文件。设置plane的大小。

hong3731的专栏 1753

Spring AOP 学习笔记之 常用注解

要在springboot中启用AOP,需要引入spring-boot-starter-aop依赖。

freeRoad 1248

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 272

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用Spring的注解方式实现AOP

Spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。 首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar. 然后我们写一个接口 package com.bird.service; public interface PersonServe

技术是我的毕生追求 9万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Spring AOP】基于注解的 AOP 编程

Spring AOP基于注解的 AOP 编程的开发开发步骤切入点复用切换动态代理的创建方式(JDK、Cglib)AOP 开发中的一个坑(业务方法互相调用)AOP 知识总结 更多内容请查看笔记目录:【Spring 5.x】学习笔记汇总 基于注解的 AOP 编程的开发 开发步骤 原始功能 public interface UserService { void register(User user); boolean login(String name, String password);

萌宅鹿的技术小屋 2592

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

spring中aop的注解实现方式

注解方式实现aop我们主要分为如下几个步骤 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类。 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象。(此注释修饰的方法的方法体为空,不需要写功能比如 public void say(){};就可以了,方法名可以被候命的具体服务功能所以引用,它可以被理解为切点对象的一个代理对象方法) 3.在对应的方...

wujian_csdn_csdn的博客 5571

Spring AOP注解开发详解

概念:指的是遵循特定的语法用于捕获每一个种类的可使用连接点的语法。作用:用于对符合语法格式的连接点进行增强。

xiaotiaoza的博客 1306
上一篇: 图解 Kafka 网络层实现机制之上篇
下一篇: Redis+Caffeine两级缓存,让访问速度纵享丝滑
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值