深入探索spring技术内幕(七): 配置Spring AOP面向切面编程

【Spring】 AOP面向切面编程 横切关注点从每个方法中抽取出来的同一类非核心业务。在同一个项目中,我们可以使用多个横切关注点对相关方法进行多个不同方面的增强。有十个附加功能,就有十个横切关注点。AOP核心关注点和横切关注点。业务处理的主要流程是核心关注点,非核心代码是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务、异常等。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。(分离核心业务代码与非核心代码通知(增强)每一个横切关注点。 阅读详情

https://blog.youkuaiyun.com/zdp072/article/details/26162801

版权声明:    https://blog.youkuaiyun.com/zdp072/article/details/26162801
一. AOP一些概念

Aspect( 切面 ): 指横切性关注点的抽象即为切面, 它与类相似, 只是两者的关注点不一样, 类是对物体特征的抽象, 而切面横切性关注点的抽象.
joinpoint( 连接点 ): 指那些被拦截到的点. 在spring中, 这些点指的是方法, 因为spring只支持方法类型的连接点, 实际上joinpoint还可以是field或类构造器)
Pointcut( 切入点 ): 指我们要对那些joinpoint进行拦截的定义.
Advice( 通知 ): 指拦截到joinpoint之后所要做的事情就是通知. 通知分为前置通知、后置通知、异常通知、最终通知、环绕通知.
Target( 目标对象 ): 代理的目标对象。
Weave( 织入 ): 指将aspects应用到target对象并导致proxy对象创建的过程称为织入.
Introduction( 引入 ): 在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

二. 基于注解声明切面 

使用注解配置aop会是代码非常简洁:

① 引入Jar包

aspectjrt.jar

aspectjweaver.jar

cglib-nodep-2.1_3.jar

commons-logging.jar

spring.jar

② 业务类: PersonServiceImpl

@Service("personServiceImpl") 
public class PersonServiceImpl {
 
    public String save(String name) {
        // throw new RuntimeException("我爱例外");
        System.out.println("我是save()方法");
        return "success";
    }
 
}

③ AOP切面类

@Aspect
@Component
public class MyInterceptor {
 
    @SuppressWarnings("unused")
    @Pointcut("execution (* com.zdp.service.impl.PersonServiceImpl.*(..))")   // 拦截PersonServiceImpl类下的所有方法
    private void anyMethod() {
    } // 声明一个切入点
 
    @Before("anyMethod() && args(name)")
    public void doAccessCheck(String name) {
        System.out.println("前置通知:" + name);
    }
 
    @AfterReturning(pointcut = "anyMethod()", returning = "result")
    public void doAfterReturning(String result) {
        System.out.println("后置通知:" + result);
    }
 
    @After("anyMethod()")
    public void doAfter() {
        System.out.println("最终通知");
    }
 
    @AfterThrowing(pointcut = "anyMethod()", throwing = "e")
    public void doAfterThrowing(Exception e) {
        System.out.println("例外通知:" + e);
    }
 
    @Around("anyMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("进入方法");
        Object result = pjp.proceed();
        System.out.println("退出方法");
        return result;
    }
}

④ 配置文件beans.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" 
       xmlns:aop="http://www.springframework.org/schema/aop"      
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
        <context:component-scan base-package="com.zdp"/>
        <aop:aspectj-autoproxy/> 
</beans>

⑤ 测试类

public class SpringAOPTest {
    @Test
    public void testSave() {
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
        PersonServiceImpl psi = (PersonServiceImpl) cxt.getBean("personServiceImpl");
        psi.save("zhangsan");
    }
}
测试结果:

        前置通知:zhangsan
        进入方法
        我是save()方法
        后置通知:success
        最终通知
        退出方法

注意: 以上只是一个测试AOP注解, 没有写接口PersonService, 所以无法使用动态代理, 所以要引入CGLIB包.


三. 基于配置声明切面 

① 引入jar包

aspectjrt.jar

aspectjweaver.jar

cglib-nodep-2.1_3.jar

commons-logging.jar

spring.jar


② 业务类: PersonServiceImpl


public class PersonServiceImpl {
    
    public String getPersonName(Integer id) {
        System.out.println("我是getPersonName()方法");
        return "xxx";
    }
    
}

③ AOP切面类

public class MyInterceptor {
    public void doAccessCheck() {
        System.out.println("前置通知");
    }
 
    public void doAfterReturning() {
        System.out.println("后置通知");
    }
 
    public void doAfter() {
        System.out.println("最终通知");
    }
 
    public void doAfterThrowing() {
        System.out.println("例外通知");
    }
 
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("进入方法");
        Object result = pjp.proceed();
        System.out.println("退出方法");
        return result;
    }
}

④ 配置文件beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" 
       xmlns:aop="http://www.springframework.org/schema/aop"      
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
        <aop:aspectj-autoproxy/> 
        <bean id="personServiceImpl" class="com.zdp.service.impl.PersonServiceImpl" />
        <bean id="aspetbean" class="com.zdp.spring.MyInterceptor" />
        <aop:config>
            <aop:aspect id="asp" ref="aspetbean">
                <aop:pointcut id="mycut" expression="execution(* com.zdp.service..*.*(..))"/>
                <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
                <aop:after-returning pointcut-ref="mycut" method="doAfterReturning"/>
                  <aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
                  <aop:after pointcut-ref="mycut" method="doAfter"/>
                  <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
            </aop:aspect>
        </aop:config>
</beans>

⑤ 测试类
public class SpringAOPTest {
 
    @Test 
    public void interceptorTest(){
        ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
        PersonServiceImpl psi = (PersonServiceImpl)cxt.getBean("personServiceImpl");
        psi.getPersonName(1);
    }
}
测试结果:

        前置通知
        进入方法
        我是getPersonName()方法
        后置通知
        最终通知
        退出方法

四. 切入点表达式

表达式格式:

* execution(
                       * 1. modifiers-pattern?         修饰符模式
                                                                         * 方法使用的修饰符
                       * 2. ret-type-pattern            返回类型模式(必须) 
                                                                         * 返回类型模式决定了方法的返回类型必须一次匹配一个连接点
                                                                         * 你会使用的最频繁的返回类型模式是*,它代表匹配任意的返回类型
                       * 3. declaring-type-pattern? 声明类型模式
                                                                         * 方法所在类的全路径
                       * 4. name-pattern                  名字模式(必须)
                                                                         * 名字模式匹配的是方法名,你可以使用*通配符作为所有或者部分命名模式
                                                                            saveUser  -- 方法必须是saveUser
                                                                            save* -- 方法以save开头
                       * 5. param-pattern                 参数模式(必须)
                                                                         * ()匹配一个不接受任意参数的方法
                                                                         * (..)匹配一个接受任意数量参数的方法(零个或者更多)
                                                                         * (*)匹配一个接受任何类型的参数的方法
                                                                         * 模式(*,String)匹配一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型
                       * 6. throws-pattern?              异常模式
)

表达式例子:

1. 任意公共方法的执行: execution(public * *(..))
2. 任何一个名字以“set”开始的方法的执行: execution(* set*(..))
3. AccountService接口定义的任意方法的执行:execution(* com.xyz.service.AccountService.*(..))
4. 在service包中定义的任意方法的执行:execution(* com.xyz.service.*.*(..))
5. 在service包或其子包中定义的任意方法的执行:execution(* com.xyz.service..*.*(..))
--------------------- 
作者:zdp072 
来源:优快云 
原文:https://blog.youkuaiyun.com/zdp072/article/details/26162801 
版权声明:本文为博主原创文章,转载请附上博文链接!

探索 Spring AOP:强大的面向切面编程框架 Spring AOP 是 Spring 框架中非常强大的特性,它为处理横切关注点提供了一种优雅而高效的解决方案。通过理解其核心概念、实现原理、使用方式以及遵循最佳实践,开发者能够在实际项目中更好地利用 Spring AOP 来提高代码质量、可维护性和可扩展性。无论是大型企业级应用还是小型项目,合理运用 Spring AOP 都能够显著提升开发效率并降低代码复杂度,使我们能够更加专注于核心业务逻辑的实现,同时轻松应对各种横切关注点的需求。 阅读详情

相关推荐

QMT与通达信代码实战:从预警到交易的自动化实现

本文详细介绍了如何利用QMT量化交易平台与通达信软件实现从预警到交易的全自动化。通过读取通达信预警生成的板块文件,QMT策略可自动执行买卖指令,有效解决手动交易滞后问题。文章提供了完整的代码框架、核心原理拆解及实盘注意事项,帮助投资者构建高效、纪律性的自动化交易系统。

ansible6ops的博客 648

Java+jsp+AOP知识点总结

** jsp中的6个动作 ** <jsp:include > 动态包含 jsp:forward 请求转发 jsp:param 设置请求参数 jsp:useBean 创建一个对象 jsp:setProperty 给指定的对象属性赋值 jsp:getProperty 取出指定对象的属性值 jquery的选择器 ,id选择器:KaTeX parse error: Expected '}', got '#' at position 3: {“#̲id”}类选择器:{“.slass”}s复选框选择器:$(

weixin_48364455的博客 423

CASIA数据集解析:图像篡改检测的黄金标准与实践指南

本文深入解析了CASIA数据集在图像篡改检测领域的核心价值与应用实践。作为中科院自动化所打造的黄金标准,CASIA数据集通过模拟真实篡改场景(如拼接和复制移动)为研究者提供全面支持。文章详细对比了v1.0与v2.0版本差异,分享数据预处理和模型训练的最佳实践,并探讨了未来研究方向,是图像篡改检测领域的重要参考指南。

kappa的博客 784

【SSM直击大厂】第十章:Spring AOP面向切面编程

🙊🙊作者主页:🔗求不脱发的博客 📔📔 精选专栏:🔗SSM直击大厂 📋📋 精彩摘要:SpringAOP面向切面编程是Java OOP面向对象编程的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍 生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序 的可重用性,同时提高了开发的效率。 💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞 📚 📖 📝1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ ..

专注Spring、SSM、数据结构与算法、蓝桥杯领域创作者 3531

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

Ubuntu24安装MongoDB(解压版)

依据前面 Linux 发行版本的信息,选择你需要的版本,文件格式选择 tgz 格式,最后点击 Download(下载到你的电脑)或 点击 Copy link 左侧图标(复制下载链接在使用服务器下载)依据前面 Linux 发行版本的信息,选择你需要的版本,文件格式选择 tgz 格式,最后点击 Download(下载到你的电脑)或 点击 Copy link 左侧图标(复制下载链接在使用服务器下载)默认情况下,只能在本机访问 MongoDB,要想远程访问 MongoDB,需要修改配置文件。

rao991207823的博客 2021

Spring AOP 面向切面编程

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个核心功能,用于在应用程序中实现横切关注点(cross-cutting concerns)的模块化。在传统的面向对象编程(OOP)中,横切关注点(如日志记录、性能监控、事务管理、安全控制等)往往散布在整个代码库中,导致代码的复用性和可维护性下降。AOP提供了一种将这些关注点从它们所服务的业务逻辑中分离出来的方式。切面(Aspect)切面是描述横切关注点的模块。它封装了影响多个类的行为。

zhzjn的博客 1887

华为OD机试 双机位C卷:微服务的集成测试 (C/C++/Py/Java/JS/Go)

华为OD机试 双机位C卷 :微服务的集成测试 ,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 微服务的集成测试 , 华为OD 微服务的集成测试

qq_45776114的博客 2066

Spring AOP面向切面编程

面向切面编程是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只是修改这个行为即可。AOP通过提供另一种思考程序结构的方式来补充了面向对象编程(OOP)。OOP中模块化的基本单元是类(class),而AOP中模块化的基本单元是切面(aspect)。可以这么理解,OOP是解决了纵向的代码复用问题,AOP是解决了横向的代码复用问题。Spring的关键组件之一是AOP框架。

深入Java世界:探索编程之美与技术深度 1028

六、Tool 工具系统:让大模型拥有“手脚“

我问你一个问题:大模型能不能告诉你"北京今天天气怎么样"?能——它能用非常流畅的中文回答你不能——它不知道这个答案因为它没有联网能力,也没有实时数据。它可能会自信地编一个"今天晴,25 度"给你——这就是幻觉。问题出在哪?大模型是一个"推理引擎",不是一个"执行引擎"。它知道天气 API 怎么调用,但不能真的发出 HTTP 请求。它知道 Python 代码怎么写,但不能真的运行代码。它知道数学公式,但做不了精确的大数计算。Tool 工具系统解决的,就是这个"最后一公里"问题。

牛肉胡辣汤 157

RK3568平台开发系列讲解(中断及异常篇)中断下半部:中断线程化

以前用 work 来线程化地处理中断,一个 worker 线程只能由一个 CPU 执行, 多个中断的 work 都由同一个 worker 线程来处理,在单 CPU 系统中也只能忍着 了。少数中断不能线程化,典型的例子是时钟中断,有些流氓进程不主动让出处理器,内核只能依靠周期性的时钟中断夺回处理器的控制权,时钟中断是调度器的脉搏。中断处理线程是优先级为50、调度策略是SCHED_FIFO的实时内核线程,名称是“irq/”后面跟着Linux中断号,线程处理函数是。,说明是线程化的中断,那么唤醒中断处理线程。

内核笔记 435

Spring 面向切面编程AOP 详细讲解

交叉业务。这些交叉业务几乎是通用的,不管你是做银行账户转账,还是删除用户数据。日志,事务处理,安全,这些都是需要做的。如果在每一个业务处理过程当中,都参杂这些交叉业务第一:交叉业务代码在多个业务流程中反复出现,显然这个交叉业务代码并没有得到充分的复用,并且修改这些交叉业务代码的话,需要修改多处。第二:程序员无法专注核心业务代码的编写,在编写核心业务代码的同时还需要处理这些交叉业务。使用 AOP 可以很轻松的解决以上问题。如下图:可以更好的理解 AOP思想。简单的说AOP:就是将与核心业务。

weixin_61635597的博客 1009

YOLOv8-COCO指标转换

本文介绍了将YOLO格式数据集转换为COCO格式并评估模型性能的完整流程。首先需将YOLO格式的标注数据转换为COCO格式,通过修改classes、image_path等参数适配不同数据集。然后使用YOLO模型对验证集进行预测并保存结果为JSON格式。最后通过比较预测结果和转换后的COCO标注文件,使用COCO官方评估指标和TIDE工具进行性能分析,生成包含AP、AR等指标的报告及错误分析图表。整个过程实现了从数据准备到模型评估的完整闭环,为计算机视觉任务提供标准化的性能评估方案。

FJN110的博客 401

Spring——面向切面编程(AOP)

本文介绍了切向切面编程(AOP)中的各个概念,并用两个案例分别讲解了如何通过注解和XML配置的方式使用AOP。

行者无疆的博客 4339

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

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

AOP面向切面编程

本文介绍了Spring AOP的基本概念和应用。AOP(面向切面编程)是一种横向切割关注点的编程范式,用于解耦日志、事务等横切关注点。文章对比了Spring AOP和AspectJ框架的特点,Spring AOP基于动态代理实现,AspectJ则更强大但复杂。详细讲解了AOP核心术语(切面、切入点、通知等)和五种通知类型的使用方法,包括前置、后置、环绕等通知。通过一个简单案例演示了AOP的实际应用,展示了如何在不修改原有代码的情况下增强方法功能。

xg_960的博客 1602

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring-AOP(面向切面编程)

Aspect-Oriented Programming,是一种编程范式,旨在解决传统面向对象编程中横切关注点的问题。在AOP中,横切关注点被称为切面,切面可以独立于业务逻辑而被重用,从而提高了代码的可维护性和可重用性。AOP通过在程序执行过程中动态地将切面织入到代码中,实现了对横切关注点的处理,如日志记录、事务管理等。AOP的主要优势在于将不同关注点的代码分离开来,使代码更加模块化和易于理解。

weixin_72899212的博客 1242

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[Spring] AOP面向切面编程

AOP执行流程,切点表达式,通知类型,切点数据获取

沫洺的博客 1528

Spring AOP——Spring 中面向切面编程

文章目录一、AOP——另一种编程思想1.1 什么是 AOP1.2 为什么需要 AOP1.3 AOP 实现分类二、AOP 术语三、初步认识 Spring AOP3.1 Spring AOP 的特点3.2 Spring AOP 的简单例子四、通过注解配置 Spring AOP4.1 通过注解声明切点指示器4.2 通过注解声明 5 种通知类型4.3 通过注解声明切点表达式4.4 通过注解处理通知中的参数4.5 通过注解配置织入的方式六、总结 前几天学习 《Spring实战》 这本书,记录一下 Spring 中的

方糖世界 2754

Spring——Aop面向切面编程

文章目录一、Spring 的 AOP 简介1.1 什么是 AOP1.2 AOP 的作用及其优势1.3 AOP 的底层实现1.4 AOP 的动态代理技术1.5 JDK 的动态代理1.6 cglib 的动态代理1.7 AOP 相关概念1.8 AOP 开发明确的事项1.9 知识要点二、基于 XML 的 AOP 开发2.1 简单操作2.2 XML 配置 AOP 详解2.3 知识要点三、基于注解的 AOP 开发3.1 基本操作3.2 注解配置 AOP 详解3.3 知识要点 一、Spring 的 AOP 简介 1.1

允诺@晴天的博客 2727

Spring技术内幕:Spring AOP的实现原理(一)

一、SpringAOP的概述 1、AOP概念 AOP是Aspect-Oriented Programming(面向切面编程)的简称。维基百科的解释如下: Aspect是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。从关注点中分离出横切关注点是面向切面的程序设计的核心。分离关注点使解决特定领域问题的代码从业务逻辑代码中独立出来,业务逻

路漫漫,水迢迢 5122

spring面向切面编程AOP详解

spring面向切面编程AOP详解 文章目录spring面向切面编程AOP详解一、什么是 AOP?1.AOP 相关概念2.AOP 的作用及其优势3.AOP 的底层实现二、基于 XML 的 AOP 开发1.快速入门三、基于注解的 AOP 开发总结 一、什么是 AOP? AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,也是Spring框架中的

weixin_51405802的博客 968
上一篇: 最快最简单的排序——桶排序
下一篇: Spring MVC @RequestMapping
god_love_hlq_xff
博客等级 码龄11年 27粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值