SpringAOP的使用

SpringAOP详解+快速入门 本文介绍了 Spring AOP 的实现原理,并通过实例解析详细阐述了其实现过程。在使用 Spring AOP时,我们需要定义切面类,并为需要实现AOP的方法添加注解。 Spring 会自动将切面逻辑插入到这些方法中,从而实现AOP的功能。 阅读详情

1. AOP 相关术语

  1. Joinpoint(连接点):
    所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的
    连接点。
  2. Pointcut(切入点):
    所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
  3. Advice(通知/增强):
    所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
    通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
  4. Introduction(引介):
    引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方
    法或 Field。
  5. Target(目标对象):
    代理的目标对象。
  6. Weaving(织入):
    是指把增强应用到目标对象来创建新的代理对象的过程。
    spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
  7. Proxy(代理):
    一个类被 AOP 织入增强后,就产生一个结果代理类。
  8. Aspect(切面):
    是切入点和通知(引介)的结合。

3. 基于配置文件配置SpringAOP

先导入springc-ontext的坐标,和aspectjweaver的坐标

<dependency>
   <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.7</version>
</dependency>
  1. 提供一个类(UserServiceImpl),该类中的方法是需要被增强的。
public class UserServiceImpl implements IUserService {
    /**
     * 该方法需要被增强
     */
    public void showString() {
        System.out.println("UserServiceImpl中的showString方法!");
//        int i = 1/0;
    }
}
  1. 提供一个通知类(defor),该类定义了5中通知的方法
/**
	该类中定义的方法用来增强UserServiceImpl中的方法
*/
public class defor {
    public void beforeAdvice(){
        System.out.println("前置通知");
    }
    public void afterAdvice(){
        System.out.println("后置通知");
    }
    public void exceptionAdvice(){
        System.out.println("异常通知");
    }
    public void finallyAdvice(){
        System.out.println("最终通知");
    }
    public Object aroundAdvice(ProceedingJoinPoint p){
        System.out.println("环绕通知");
        try {
            System.out.println("前置通知");
            Object[] args = p.getArgs();
            Object proceed = p.proceed(args);
            System.out.println("后置通知");
            return proceed;
        } catch (Throwable t) {
            System.out.println("异常通知");
            t.printStackTrace();
            throw new RuntimeException(t);
        }finally {
            System.out.println("最终通知");
        }
    }
}
  1. 配置文件中引入约束
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
  1. 配置文件中先把这两个类配到容器中
<bean id="IUserService" class="com.itzpx.service.impl.UserServiceImpl"></bean>
<bean id="defor" class="com.itzpx.utils.defor"></bean>
  1. 配置通知
<aop:config>
 <aop:aspect id="deforAdvice" ref="defor">
     <aop:pointcut id="pointcutId" expression="execution(* com.itzpx.service.impl.*.*(..))"></aop:pointcut>
<!--<aop:before method="beforeAdvice" pointcut-ref="pointcutId"></aop:before>-->
<!--<aop:after-returning method="afterAdvice" pointcut-ref="pointcutId"></aop:after-returning>-->
<!--<aop:after-throwing method="exceptionAdvice" pointcut-ref="pointcutId"></aop:after-throwing>-->
<!--<aop:after method="finallyAdvice" pointcut-ref="pointcutId"></aop:after>-->
     <aop:around method="aroundAdvice" pointcut-ref="pointcutId"></aop:around>
 </aop:aspect>
</aop:config>
  1. 测试
public static void main(String[] args) {
	   ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
	   IUserService service = ac.getBean("IUserService", IUserService.class);
	   service.showString();
}

解释:
<aop:config>:aop的配置信息放里面
里面提供了三个标签
7. <aop:aspect id=“deforAdvice” ref=“defor”>:配置切面
id是唯一标识,随便写,ref是通知类bean的唯一标识
8. <aop:pointcut id=“pointcutId” expression=“execution(* com.itzpx.service.impl..(…))”></aop:pointcut>:配置切入点
id是唯一标识,expression指定哪个方法需要被增强
标准写法是:
public void com.包名.包名.等等.类名.方法名(参数),
通配写法是
访问修饰符省略

这种写法匹配所有的类,显然不符合我们的要求
* *..*.*(..)
我们需要加以限定
* * com.itzpx.service.impl.*.*(..)
  1. 在 <aop:aspect id=“deforAdvice” ref=“defor”>下面提供了
<aop:aspect id="deforAdvice" ref="defor">
   <aop:pointcut id="pointcutId" expression="execution(* com.itzpx.service.impl.*.*(..))"></aop:pointcut>
    <aop:before method="beforeAdvice" pointcut-ref="pointcutId"></aop:before>
    <aop:after-returning method="afterAdvice" pointcut-ref="pointcutId"></aop:after-returning>
    <aop:after-throwing method="exceptionAdvice" pointcut-ref="pointcutId"></aop:after-throwing>
    <aop:after method="finallyAdvice" pointcut-ref="pointcutId"></aop:after>
    <aop:around method="aroundAdvice" pointcut-ref="pointcutId"></aop:around>
</aop:aspect>

五个标签,分别代表了
pointcut 提取expression
before配置前置通知
after-returning后置通知
after-throwing异常通知
after最终通知
around环绕通知

4.关于环绕通知的问题

环绕通知其实是提供了一种编码编写通知的方式
在环绕通知中,包含了其他四种通知
ProceedingJoinPoint ,是spring提供的类
与我们动态代理中的involved方法类似用法

5.注解配置AOP

<!--1.将IUserService与defor放入容器-->
<bean id="IUserService" class="com.itzpx.service.impl.UserServiceImpl"></bean>
<bean id="defor" class="com.itzpx.utils.defor"></bean>

<aop:config>
<!--2.标识出通知类-->
    <aop:aspect id="deforAdvice" ref="defor">
    <!--3.切入点的配置,也就是指定需要被增强的方法-->
        <aop:pointcut id="pointcutId" expression="execution(* com.itzpx.service.impl.*.*(..))"></aop:pointcut>
        <!--4.指定通知方法,并与需要被增强的方法联系起来-->
        <aop:before method="beforeAdvice" pointcut-ref="pointcutId"></aop:before>
        <aop:after-returning method="afterAdvice" pointcut-ref="pointcutId"></aop:after-returning>
        <aop:after-throwing method="exceptionAdvice" pointcut-ref="pointcutId"></aop:after-throwing>
        <aop:after method="finallyAdvice" pointcut-ref="pointcutId"></aop:after>
        <aop:around method="aroundAdvice" pointcut-ref="pointcutId"></aop:around>
    </aop:aspect>
</aop:config>
  1. 将IUserService与defor放入容器
<context:component-scan base-package="com.itzpx"/>
@Component
public class defor {
@Component
public class UserServiceImpl implements IUserService {
  1. 标识出通知类
@Component
@Aspect//代表通知类
public class defor {
  1. 切入点的配置,也就是指定需要被增强的方法
@Pointcut("execution(* com.itzpx.service.impl.*.*(..))")
private void pt1(){}
  1. 指定通知方法,并与需要被增强的方法联系起来
@Before("pt1()")
    public void beforeAdvice(){
        System.out.println("前置通知");
    }
    @AfterReturning("pt1()")
    public void afterAdvice(){
        System.out.println("后置通知");
    }
    @AfterThrowing("pt1()")
    public void exceptionAdvice(){
        System.out.println("异常通知");
    }
    @After("pt1()")
    public void finallyAdvice(){
        System.out.println("最终通知");
    }
    @Around("pt1()")
    public Object aroundAdvice(ProceedingJoinPoint p){
        System.out.println("环绕通知");
        try {
            System.out.println("前置通知");
            Object[] args = p.getArgs();
            Object proceed = p.proceed(args);
            System.out.println("后置通知");
            return proceed;
        } catch (Throwable t) {
            System.out.println("异常通知");
            t.printStackTrace();
            throw new RuntimeException(t);
        }finally {
            System.out.println("最终通知");
        }
    }
  1. 开启springAOP注解配置
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
SpringAOP在项目中的简单应用 SpringAOP在项目中的简单应用   一、前言   项目背景 由于公司的机房到期,需要做应用迁移(包括数据库),割接到云平台。但是又不能进行一次性割接,需要分三个阶段:第一阶段割接2个地市,第二阶段再割接9个地市,第三阶段做全盘割接。在第一、第二阶段是要保证云平台与现网平台的应用能够正常并行运行。所以,要保证两边数据访问的正常,需要对某些功能进行改造。比如,某个子功能在并行阶段是不做... 阅读详情

相关推荐

IPsec (主模式,野蛮模式)

IPsec vpn的主模式和野蛮模式

七汣的博客 3417

AOP 专业术语 小结

AOP常用专业术语:        ① 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。 (比如项目中持久化,事务管理,日志管理,角色权限,系统监控,安全性管理等)   ② 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。 (

xing421145880的专栏 1013

大疆无人机地理视频制作全流程:从SRT文件到GIS叠加(附实战避坑指南)

本文详细解析了大疆无人机地理视频制作全流程,从解析SRT文件中的位姿数据,到在GIS软件中构建地理视频工程并生成可分发的文件。文章重点介绍了地理视频的核心概念、数据处理实战技巧,并探讨了其在应急响应、工程巡检等场景的高级应用与精度边界,为GIS工程师和无人机爱好者提供了一份实用的避坑指南。

river的博客 466

SpringAOP是啥,怎么用?

SpringAOP是啥,怎么用? 一、面试问题:什么是SpringAOP? SpringAOP的全称是(Aspect Oriented Programming)中文翻译过来是面向切面编程,个人理解:主要意思是我们的传统架构至上而下,后期想要从中间切入写代码添加功能,比如日志、权限、事务等,这时候我们就需要写使用代理模式写,而springaop就是专门把这一块写代码的地方给抽象了出来称为切面,从而解决的代码混乱的问题,它的底层实现也是基于代理模式(动态代理)完成的。 二、SpringAOP的应用场景有

Object_de_Father的博客 19万+

Android14_MTK调试LCD屏功能

android14 MTK平台调试LCD屏

m0_37786046的博客 1473

Qt开发者必看:QTimer::singleShot的5个实战避坑指南(含lambda和多线程案例)

本文为Qt开发者提供了QTimer::singleShot的5个关键实战避坑指南,涵盖lambda捕获、对象生命周期和多线程安全等核心难点。通过对比错误与正确代码示例,深入解析了如何避免悬空指针、确保线程执行上下文正确以及管理定时任务资源,帮助开发者编写更健壮、可靠的延迟执行代码。

stem5的博客 466

SpringAOP学习--SpringAOP简介及原理

前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOP。 Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利。 前文提到AOP的实现有AspectJ、JDK动态代理、CGLIB动态代理,SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理。 JDK动态代理回顾 上一篇简单介绍了

u012098021的博客 6万+

42、多媒体与虚拟现实在艺术和影视领域的创新应用

本文探讨了多媒体与虚拟现实在艺术和影视领域的创新应用,涵盖三个典型案例:影视与人类学融合项目通过协作模式模糊作者与观众界限,推动文化文献的发展;交互式数字短片《分手》利用基于对象的广播技术探索个性化影视体验;威尼斯双年展瑞士馆4D项目则通过虚拟现实技术实现文化遗产的数字化展示。这些案例展示了技术在叙事、用户体验及文化保护中的深度应用,并展望了未来技术融合、个性化深化与文化遗产传承的发展趋势。

kappa的博客 115

SpringAOP使用

一、AOP介绍 AOP ,面向切面编程,在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。其实就是在代码运行,进行一定的包装,如在方法执行前、方法返回后、方法抛出异常后等地方进行一定的拦截处理或者叫增强处理 先讲一下AspectJ和Spring AOP关系,网上很多文章对AspectJ存在错误说法 AspectJ: AspectJ 来自于 Eclipse 基金会,...

LJJZJ的博客 586

LLCC68芯片系统架构与LoRa驱动开发核心解析

LoRa射频收发器是低功耗广域物联网(LPWAN)的关键组件,其本质是集成了调制解调器、协议引擎、数据缓冲区与电源管理的专用SoC。理解其工作模式状态机(Sleep/Standby/TX/RX)与SPI主机接口时序规范,是实现稳定通信的基础。LLCC68通过寄存器映射与命令集双接口抽象硬件控制,支持LoRa扩频调制与FSK兼容模式,具备高链路预算(157 dB)和DC-DC/LDO动态电源切换能力。典型应用场景包括远距离传感器节点、智能表计与工业无线监测系统。本文深入剖析LLCC68的信号链路径、中断机制与

weixin_29859471的博客 284

【速通RAG实战:索引】4.RAG文档解析技术

通过本文技术方案,可构建高精准、高效率的文档解析流水线,为 RAG 应用提供坚实的知识底座。核心在于**格式解析的鲁棒性**和**语义分块的准确性**,后续通过持续的性能优化和质量监控,逐步提升索引质量和检索效率。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1547

SpringAOP的简单使用

这里是修真院后端小课堂,每篇分享文从 八个方面深度解析后端知识/技能,本篇分享的是: 【SpringAOP的简单使用】 大家好,我是IT修真院成都分院第13期的学员,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务一,深度思考中的知识点——SpringAOP的简单使用 (1)背景介绍: AOP(Aspect Oriented Programming),面向切面编程,是O...

learning__java的博客 210

基于DSIFT多尺度图像融合的MATLAB代码

多尺度图像融合是一种常用的图像处理技术,它可以将具有不同尺度和空间频率特征的图像融合成一幅更具信息丰富度和视觉效果的图像。DSIFT算法是一种基于SIFT算法的改进版本,它在提取图像特征时采用了密集采样的方法,能够有效地提取图像的局部特征。多尺度图像融合基于DSIFT算法的思想,通过在不同尺度下提取图像的DSIFT特征,并将这些特征进行融合,得到最终的融合图像。然后,通过DSIFT算法提取了两幅图像的特征。通过运行上述代码,我们可以在MATLAB中实现基于DSIFT多尺度图像融合的算法,并观察到融合结果。

IELLQUI9的博客 181

SpringAOP

spring aop

m0_58342797的博客 374

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WINCC7.3破解文件

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

springAOP

AOP是Aspect Oriented Programming(面向切面编程),切面是指某一特定问题,所以AOP也可以理解为面向特定方法编程。比如我们在用户登录时设置登录校验拦截器,就是对“登录校验”这一类问题的统一处理,所以拦截器是AOP的一种应用,而AOP是一种思想,拦截器就是AOP思想的一种实现。而Spring框架也实现了这种思想,提供了拦截器技术的相关接口。同样的,统一数据返回格式和统一异常处理,也是AOP思想的一种实现。

2202_75439262的博客 954

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

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

SpringAOP面向切面编程

介绍面向切面编程的思想(AOP),AOP的组成,SpringAOP的简单演示使用,SpringAOP基于动态代理的实现原理。

trong_ 的烂笔头 2545

OV9734 DATASHEET,完整规格书

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

简单说说SpringAOP与Aspectj的不同,以及使用SpringAOP所需的最小jar依赖

首先,SpingAop与Aspectj在面向切面编程是关注的点不同。 Spring AOP的目的并不是为了提供最完整的AOP实现(虽然Spring AOP具有相当的能力);而是为了要帮助解决企业应用中的常见问题,提供一个AOP实现与Spring IOC之间的紧密集成,能够处理业务中的横切关注点。 Aspectj提供了非常完善的AOP能力,几乎能在java ...

Snower08的博客 1466

SpringAop使用详解

Spring Aop的简单使用

灏的博客 2134

SpringAOP学习使用

AOP 前言 ​ 在学习AOP的时候被很多术语、方法和框架给搞懵。仿佛就知道AOP是个切面编程,执行方法前先执行某方法,执行完后再执行某方法。但学习不能知其然,不知其所以然。想快速理清概念,掌握AOP思想,找到合适的应用AOP场景。这里应该先理清楚AOP思想才是重点 一、AOP认识 先举个例子,设计一个日志打印的模块,按照OOP思想,先设计一个工具类,然后在需要打印的地方引用即可。刚开始没有任何问题,但是如果当调用的很多,到处都能看得到。从对象组织角度来讲,我们一般会使用继承关系为主线,我们可以称为纵向,也

qq_39381892的博客 663
上一篇: 动态代理技术
下一篇: springAOP出现的问题
RestartJava
博客等级 码龄7年 1粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值