关于spring中AOP的aspect和advisor的理解

01_MySQL下载、安装与配置(以MySQL8.0.31版本为例) 1.点击下载好的mysql安装包 进入到mysql installer界面。2.选择MySQL Servers选项 一直下拉。 阅读详情

在开发过程中,不少有Spring Aop的使用,在面向切面编程时,我们会使用< aop:aspect>;在进行事务管理时,我们会使用< aop:advisor>。那么,对于< aop:aspect>与< aop:advisor>的区别,具体是怎样的呢?

至于两者的区别,网上有很多资料,但是似乎都不能说清楚。
首先,我们需要明确两者的概念。

< aop:aspect>:定义切面(切面包括通知和切点)
< aop:advisor>:定义通知器(通知器跟切面一样,也包括通知和切点)
下面,我们列举两者的几个区别。

1、实现方式不同
< aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。

下面我们举例说明。
首先,我们定义一个接口Sleepable和这个接口的实现Human,代码如下:

public interface Sleepable {
    public void sleep();
}

public class Human implements Sleepable {

    @Override
    public void sleep() {
        System.out.println("我要睡觉了!");
    }
}

下面是< aop:advisor>的实现方式:

//定义通知
public class SleepHelper implements MethodBeforeAdvice,AfterReturningAdvice{
    @Override
    public void before(Method arg0, Object[] arg1, Object arg2)
            throws Throwable {
        System.out.println("睡觉前要脱衣服!");
    }

    @Override
    public void afterReturning(Object arg0, Method arg1, Object[] arg2,
            Object arg3) throws Throwable {
        System.out.println("起床后要穿衣服!");
    }
}

//aop配置
<bean id="sleepHelper" class="com.ghs.aop.SleepHelper"></bean>

<aop:config>
    <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
    <aop:advisor advice-ref="sleepHelper" pointcut-ref="sleepPointcut"/>
</aop:config>

<bean id="human" class="com.ghs.aop.Human"/>

下面是< aop:aspect>的实现方式:

//定义切面
public class SleepHelperAspect{
    public void beforeSleep(){
        System.out.println("睡觉前要脱衣服!");
    }

    public void afterSleep(){
        System.out.println("起床后要穿衣服!");
    }
}

//aop配置
<bean id="sleepHelperAspect" class="com.ghs.aop.SleepHelperAspect"></bean>

<aop:config>
    <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
    <aop:aspect ref="sleepHelperAspect">
        <!--前置通知-->
        <aop:before method="beforeSleep" pointcut-ref="sleepPointcut"/>
        <!--后置通知-->
        <aop:after method="afterSleep" pointcut-ref="sleepPointcut"/>
    </aop:aspect>
</aop:config>

<bean id="human" class="com.ghs.aop.Human"/>

测试代码如下:

public class TestAOP {
    public static void main(String[] args) {
        method1();
//      method2();
    }

    private static void method1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
        Sleepable sleeper = (Sleepable) context.getBean("human");
        sleeper.sleep();
    }

    private static void method2() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
        Sleepable sleeper = (Sleepable) context.getBean("human");
        sleeper.sleep();
    }

//执行结果
睡觉前要脱衣服!
我要睡觉了!
起床后要穿衣服!
}

2、使用场景不同
< aop:advisor>大多用于事务管理。
例如:

<!-- 会重复读,不会脏读事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" timeout="120" propagation="REQUIRED" rollback-for="Exception" />
    </tx:attributes>
</tx:advice>

<aop:config proxy-target-class="true">
    <aop:pointcut id="txPointCut" expression="..."/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>

< aop:aspect>大多用于日志,缓存

其实,不管是< aop:advisor>还是< aop:aspect>最终的实现逻辑是一样的。

小结:
可以看出,< aop:advisor>和< aop:aspect>其实都是将通知和切面进行了封装,原理基本上是一样的,只是使用的方式不同而已。

在AOP中有几个概念:
— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。

— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。

— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

所以“<aop:aspect>”实际上是定义横切逻辑,就是在连接点上做什么,
“<aop:advisor>”则定义了在哪些连接点应用什么<aop:aspect>。
Spring这样做的好处就是可以让多个横切逻辑(即<aop:aspect>定义的)多次使用,提供可重用性。
10X Visium空间转录组学入门:从芯片结构到数据分析全流程解析(附避坑指南) 本文全面解析10X Visium空间转录组学技术,从芯片物理结构、探针化学原理到湿实验全流程操作与避坑指南,并详细介绍了从FASTQ数据到空间可视化的核心分析流程。文章旨在帮助科研人员跨越从理论到实操的鸿沟,掌握从样本准备、文库构建到使用Space Ranger和Seurat进行数据分析与可视化的完整路径,为组织生物学研究提供清晰的实践指引。 阅读详情

相关推荐

Unity AR开发实战:从Vuforia图片识别到实体识别全流程解析

增强现实(AR)技术通过计算机视觉算法将虚拟信息叠加到现实世界,其核心原理在于对现实环境的感知与理解。在移动端AR开发中,图像识别与物体识别是实现虚实融合的关键技术,它们决定了虚拟内容能否准确、稳定地与现实对象对齐。Vuforia作为成熟的商业AR SDK,为开发者提供了从平面图像识别(Image Target)到三维实体识别(Model Target)的完整解决方案,极大降低了计算机视觉技术的应用门槛。在工程实践中,Vuforia通过封装复杂的特征提取与匹配算法,使开发者能够专注于交互设计与内容制作,广泛

weixin_30972263的博客 301

Spring源码分析----AOP概念(Advice,Pointcut,Advisor)和AOP的设计与实现

一、基本知识 1.1.AOP基本概念: Aspect-Oriented Programming,面向方面编程的简称,Aspect是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern),从关注点中分离出横切关注点是面向方面程序设计的核心所在。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不再含有针对特定领域

a657281084的博客 5139

IEC61850建模实战:从标准解读到ICD文件生成

本文详细介绍了IEC61850建模的实战过程,从标准解读到ICD文件生成,涵盖了变电站自动化系统的结构化数据模型设计。通过分层结构、标准服务映射和XML文件解析,帮助读者掌握电力系统智能电子设备的标准化建模方法,提升工程实施效率。

weixin_30823001的博客 413

Spring AOP(三)-AOP的Advisor

一、spring 切面的Advisor 顾问(Advisor) : 他将通知进行了包装,根据通知的不同类型,在不同的时间点,将切面织入到指定的目标对象的某些连接点(方法)。 PointCutAdvisor是顾问的一种,它是一个接口,有两个实现: * NameMatchMethodPointCutAdvisor 名称匹配方法 切入点顾问 详见appliactionContext.xml

蓝色的青春_巍 642

谷歌倾斜摄影数据获取以及转换3DTiles介绍

解析谷歌倾斜模型数据,再一键设置无人值守的情况下,快速将谷歌倾斜摄影模型数据转成3DTiles数据,并在Cesium上进行流畅漫游缩放显示,效果优于官方3DTiiles格式数据

cyber_room的博客 5335

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 481

spring 中aop的advisor和aspect的区别

spring 中的aop:advisor和aop:aspect的区别 在AOP中有几个概念: — 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。 — 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。 — 通知(Advice):在特定...

qq_25087307的博客 2082

VSCode配置ClangFormat:让C++大括号乖乖不换行(附常见样式对比)

本文详细介绍了如何在VSCode中配置ClangFormat,实现C++代码大括号不换行的格式化风格。通过对比Attach、Allman等主流大括号样式,并提供从快速设置到项目级配置的完整指南,帮助开发者打造统一、高效的代码格式化工作流,提升团队协作效率。

weixin_28835551的博客 215

聊聊spring aop中的advisor组件

在spring aop中,

cyh的博客 7358

【华为OD技术面试手撕真题】1、长度最小的子数组 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(三种解法)

【华为OD面试手撕真题】长度最小的子数组,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 1万+

控制科学与工程(自动化)保研经验【2】——南开、同济篇

禁止转载 1、南开人工智能学院夏令营   保研之旅第一个夏令营就是南开,南开夏令营非常早(6月份),当时我们专业仅有两人入营。夏令营前一天我们两个坐高铁来到了天津,几经辗转来到了南开的津南校区,非常偏僻。在自己找的酒店住了一晚,第二天一早去学院报到,资格审查、报销路费等等,然后开营仪式,吃饭,入住酒店,实验室参观。   开营仪式和实验室参观了解到,南开人工智能学院是国内第一批人工智能学院,和很多高...

Control Everything 6532

advisor和aspect有什么区别,为什么在代理类生成之前会将全部的aspect和通用拦截器(MethodInterceptor)适配成advisor?

aspect是切面是由advice(通知=连接点JoinPoint+衡器逻辑)和切点(pointCut)组成一个切面可以有多个通知;advisor也是一种切面但是只包含一个通知;将aspect适配成advisor是为了方便SpringAOP创建代理类的时候进行横切逻辑执行的管理。可以里理解为aspect是面向开发者的一种切面,支持在一个类里创建多个通知方便使用,advisor是面向SpringAOP的一种切面把多个aspect按通知拆分出来方便管理。通用拦截器适配成advisor也是为了方便统一管理,通用拦

yangxiaofei_java的博客 1197

Python控制程控电源(USB)

随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制,控制电源上下电,监听电源电流、电压等,以下就以常见的艾德克斯程控电源为例,分享如何通过USB连接方式Python语言来控制程控电源。

测试领域技术分享 2864

spring关于Aspect、Joinpoint、Advice Pointcut的区别

Aspect Joinpoint Advice Pointcut 区别 When you go out to a restaurant, you look at a menu and see several options to choose from. You can order one or more of any of the items on the menu. But until ...

arthur.dy.lee的专栏 2036

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring源码系列(四)--spring-aop是如何设计的

顾名思义,spring-aop 是用来做 AOP 开发的,搭配 spring-bean 一起使用的话,AOP 将更加解耦、方便。在实际项目中,spring-aop 被广泛用来实现日志、权限、事务、异常等的统一管理。 上一篇博客简单讲了 spring-aop 的基础组件、架构和使用方法,本文将开始研究 spring-aop 的源码,主要分成以下部分: 1. spring-aop 的几个重要的组件,如 Joinpoint、Advice、Pointcut、Advisor 等; 2. spring-aop 是如何设

子月生的博客 237

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Aspect Joinpoint Advice Pointcut 区别

Aspect Joinpoint Advice Pointcut 区别 When you go out to a restaurant, you look at a menu and see several options to choose from. You can order one or more of any of the items on the menu. But unti...

arthur.dy.lee的专栏 2951

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring实现AOP的三种方式

Spring实现AOP的方式有三种 方式一:使用<aop:advisor >的形式,此时要将类实现相应的接口。 方式二:使用<aop:aspect >的形式,只需要自己写的一个类,类中有定义方法即可。 方式三:使用相关的注解。@Aspect、@Before、@After 方式1代码实现: java代码: public class AfterLogClass implements AfterReturningAdvice { @Override public void

一只九菜的博客 1389

Spring proxy获取target总结

Spring proxy获取target总结 Aspect方式 在使用Aspect方式时候,在around advice的第一个参数ProceedingJoinPoint(Join Point)的实现类,可以通过getTarget的方式获取被代理的plain service. Advisor方式 使用MethodInterceptor作为advice,参数类型是MethodInvocation. ...

sutonline的博客 3570

【Spring从成神到升仙系列 三】2023年再不会 AOP 源码,就要被淘汰了

对于Java开发者而言,关于 Spring ,我们一般当做黑盒来进行使用,不需要去打开这个黑盒。但随着目前程序员行业的发展,我们有必要打开这个黑盒,去探索其中的奥妙。本期 Spring 源码解析系列文章,将带你领略 Spring 源码的奥秘。本期源码文章吸收了之前 Kafka 源码文章的错误,将不再一行一行的带大家分析源码,我们将一些不重要的分当做黑盒处理,以便我们更快、更有效的阅读源码。废话不多说,发车!

爱敲代码的小黄 2040

AOP面向切面编程学习总结

spring的三大核心:控制反转、依赖注入、面向切面编程。 控制反转:对象A依赖对象B,如果收到把对象B给new出来,会使代码高度耦合,产生硬编码。为了避免这种情况,通过注解或配置XML将bean托管给spring管理。由spring进行bean实例的创建 依赖注入:当spring把对象B创建出来后,需要设置到对象A中,这一过程称为依赖注入 面向切面编程:什么是面向切面编程?在运行时,动态地

小冷在努力~ 155

Spring Aop中切面Aspect与Advisor

切面(Aspect)” 是 AOP 的核心理论概念,代表跨类关注点的模块化;“Advisor” 是 Spring AOP 中对 “切面” 的一种具体实现,是 “切点 + 通知” 的封装,属于 “切面” 的子集或特定形式。因此,不能直接说 “Advisor 就是 AOP 的切面”,但可以说 “Advisor 是 Spring AOP 中实现切面功能的一种方式”。

weixin_43578751的博客 383

xml中 aop:aspect aop:advisor如何配置

我们知道Spring-AOP的核心执行流程是这样的. 1. Spring Ioc初始化所有Bean. 如果初始化Bean的时候发现改Bean满足pointcut中SpEl表达式, 则将该Bean做动态代理. 2. 在Bean的方法执行时,判断该Bean是否为代理对象,若是代理对象的话, 判断当前Method是否满足aop表达式, 3. 如果满足表达式,则按照顺序通知Aop配置的各通知(前,后...

yangsnow_rain_wind的专栏 3111

aop:aspect与aop:advisor的区别

在开发过程中,不少有Spring Aop的使用,在面向切面编程时,我们会使用< aop:aspect>;在进行事务管理时,我们会使用< aop:advisor>。那么,对于< aop:aspect>与< aop:advisor>的区别,具体是怎样的呢? 在面向切面编程时,我们一般会用<aop:aspect>,<aop:aspec...

chao430的博客 1215

spring中aop编程中aop:aspect与aop:advisor的区别

转发自:https://www.jianshu.com/p/40f79da0cdef 在开发过程中,不少有Spring Aop的使用,在面向切面编程时,我们会使用< aop:aspect>;在进行事务管理时,我们会使用< aop:advisor>。那么,对于< aop:aspect>与< aop:advisor>的区别,具体是怎样的呢? 至于两者的区...

qq_38205881的博客 302

【spring】切入点(Pointcut)、方面/切面(Aspect、Advisor)详解

参考: 《《Spring》(三)---- 工厂方法与FactoryBean》

m0_45406092的博客 6283

【spring aop】连接点(Jointpoint)、切入点(Pointcut)、增强(Advice)、方面/切面(Aspect、Advisor)

文章目录前言1. 先来回顾一下AOP中的一些术语2. 增强方式简介2.1 MethodBeforeAdvice前置增强2.2 AfterReturningAdvice后置增强2.3 ThrowsAdvice异常增强2.4 MethodInterceptor环绕增强2.5 执行结果3. 总结 前言 上一章节《静态代理模式和JDK、CGLIB动态代理》分析了静态代理和JDK、CGLIB动态代理,接下来我们还要回顾一下AOP的一些相关知识,以方便为接下来分析AOP的源码做好准备。 1. 先来回顾一下AOP中的一些

m0_45406092的博客 5240
上一篇: 关于URLEncoder.encode编码后比对结果不一致的问题
sdx1237
博客等级 码龄11年 24粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值