Spring注解驱动开发——AOP常用注解

5 篇文章 1 订阅
订阅专栏

一、用于开启注解AOP支持的

@EnableAspectJAutoProxy

(一) 作用

表示开启spring对注解aop的支持。它有两个属性,分别是指定采用的代理方式和 是否暴露代理对象,通过AopContext可以进行访问。
在这里插入图片描述

(三) 属性

proxyTargetClass: 指定是否采用cglib进行代理。默认值是false,表示使用jdk的代理。
exposeProxy: 指定是否暴露代理对象,通过AopContext可以进行访问。

(四) 细节

(1) proxyTargetClass
当使用JDK的代理时,被代理类至少实现一个接口。
当使用cglib接口时,被代理类不不能是最终类,即不能用final修饰
(2)exposeProxy
在这里插入图片描述
在这里插入图片描述

二、用于配置切面

@Aspect

(一) 作用

声明当前类是一个切面类。

(二) 属性

value: 默认我们的切面类应该为单例的。但是当切面类为一个多例类时,指定预 处理的切入点表达式。用法是perthis(切入点表达式)。 它支持指定切入点表达式,或者是用@Pointcut修饰的方法名称(要求全 限定方法名)
在这里插入图片描述

(三) 使用场景

此注解也是一个注解驱动开发aop的必备注解。

(四) 多个切面的执行顺序

默认情况下,多个切面相同类型通知的执行顺序与类名首字母有关,首字母顺序靠前执行顺序靠前
在这里插入图片描述
自定义执行顺序@Order
在这里插入图片描述

三、用于配置切入点表达式

@Pointcut

(一) 作用

此注解是用于指定切入点表达式的。

(二) 属性

value: 用于指定切入点表达式。
argNames:用于指定切入点表达式的参数。参数可以是execution中的,也可以是 args中的。通常情况下不使用此属性也可以获得切入点方法参数。

配置通知时,需要获取切入点参数,与args有关
在这里插入图片描述

(三) 使用场景

在实际开发中,当我们的多个通知需要执行,同时增强的规则确定的情况下,就可 以把切入点表达式通用化。此注解就是代替xml中的< aop:pointcut >标签,实现切入点表达 式的通用化。

(四) 将切入点表达式抽取到通知类中

在这里插入图片描述
在这里插入图片描述
如果切面类是多例的
在这里插入图片描述

四、用于配置通知

@Before

(1) 作用

被此注解修饰的方法为前置通知。前置通知的执行时间点是在切入点方法执行之 前。

(2) 属性

value: 用于指定切入点表达式。可以是表达式,也可以是表达式的引用。
argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称 一致。通常不指定也可以获取切入点方法的参数内容。

(3) 使用场景

在实际开发中,我们需要对切入点方法执行之前进行增强,例如对请求的数据的编码进行处理, 此时就用到了前置通 知。在通知(增强的方法)中需要获取切入点方法中的参数进行处理时,就要配合切入点表达 式参数来使用。以下面的案例为例,案例中我们希望获得记录日志的id,注意此案例的参数个数及写法
在这里插入图片描述

@After

(一) 作用

用于指定最终通知。

(二) 属性

value: 用于指定切入点表达式,可以是表达式,也可以是表达式的引用。
argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称 一致。通常不指定也可以获取切入点方法的参数内容。

(三) 使用场景

最终通知的执行时机,是在切入点方法执行完成之后执行,无论切入点方法执行是 否产生异常最终通知都会执行。所以被此注解修饰的方法,通常都是做一些清理操作。

@AfterReturning

(一) 作用

用于配置后置通知。后置通知的执行是在切入点方法正常执行之后、方法返回之前执行。
注意
小编使用的是Spring5.3的版本,不知道是不是版本的缘故,小编写的通知的执行顺序和许多资料上不太相同,这个问题还有待研究,在这里记录一下结果
在这里插入图片描述
在这里插入图片描述

(二) 属性

value: 用于指定切入点表达式,可以是表达式,也可以是表达式的引用。
pointcut:它的作用和value是一样的。
returning:指定切入点方法返回值的变量名称。它必须和切入点方法返回值名称一 致。
argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称 一致。通常不指定也可以获取切入点方法的参数内容。

(三) 使用场景

此注解是用于配置后置增强切入点方法的。被此注解修饰方法会在切入点方法正常 执行之后执行。在我们实际开发中,像提交事务,记录访问日志,统计方法执行效率等等都可 以利用后置通知实现。
在这里插入图片描述

@AfterThrowing

作用: 用于配置异常通知。
属性:
value: 用于指定切入点表达式,可以是表达式,也可以是表达式的引用。
pointcut:它的作用和value是一样的。
throwing:指定切入点方法执行产生异常时的异常对象变量名称。它必须和异常变量 名称一致。
argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称 一致。通常不指定也可以获取切入点方法的参数内容。
使用场景:用此注解修饰的方法执行时机是在切入点方法执行产生异常之后执行。
在这里插入图片描述

一个切面内相同类型通知的执行顺序

在这里插入图片描述
结论:
(1) 一个切面内相同类型通知,按照通知的方法名字母数字ASCII码值小的优先执行,与@Order无关。如果遇到方法的重载,则继续向后比较参数列表的ASCII值的大小,规则与之前相同
(2) 不同切面之间的相同类型通知可以通过@Order调整的

@Around

(一) 作用

用于指定环绕通知。环绕通知有别于前面介绍的四种通知类型。它不是指定增强方法执行时机的,而是 spring为我们提供的一种可以通过编码的方式手动控制增强方法何时执行的机制。

(二) 属性

value: 用于指定切入点表达式,可以是表达式,也可以是表达式的引用。
argNames:用于指定切入点表达式参数的名称。它要求和切入点表达式中的参数名称 一致。通常不指定也可以获取切入点方法的参数内容。

(三) 案例

日志功能

@Component
@Aspect//表面当前类是一个切面类
public class LogUtil {

    /**
     * 需求:记录当前执行的是什么方法以及执行此方法时的相关信息
     * @return
     */
    @Around("execution(* cn.spring.service.impl.*.*(..))")
    public Object aroundPrintLog(ProceedingJoinPoint pjp) {
        Object rtValue = null;
        try {
            //创建系统日志对象
            SystemLog log = new SystemLog();
            //设置主键
            String id = UUID.randomUUID().toString().replace("_", "").toUpperCase();
            log.setId(id);
            //设置来访者IP
            log.setRemoteIP("127.0.0.1");
            //设置执行时间
            log.setTime(new Date());
            //设置当前执行的方法名称
            //1.使用ProceedingJoinPoint接口中的获取签名方法
            Signature signature = pjp.getSignature();
            //2.判断当前签名是否是方法签名
            if(signature instanceof MethodSignature) {
                //3.把签名转成方法签名
                MethodSignature methodSignature = (MethodSignature) signature;
                //4.获取当前执行的方法
                Method method = methodSignature.getMethod();
                String methodName = method.getName();
                log.setMethod(methodName);

                //设置当前方法的说明
                //7.判断当前方法上是否有@Description注解
                boolean isAnnotated = method.isAnnotationPresent(Deprecated.class);
                if (isAnnotated) {
                    //8.得到当前方法上的Deprecated注解
                    Description description = method.getAnnotation(Description.class);
                    //9.得到注解的value属性
                    String value = description.value();
                    //10.给系统日志方法说明属性赋值
                    log.setAction(value);
                }
            }

            System.out.println("环绕通知执行了记录日志" + log);

            //获取切入点表达式的参数
            Object[] args = pjp.getArgs();
            //切入点方法执行
            rtValue = pjp.proceed(args);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return rtValue;
    }

}

五、用于扩展目标类

@DeclareParents

(一) 使用场景

当我们已经完成了一个项目的某个阶段开发,此时需要对已完成的某个类加入一些 新的方法,我们首先想到的是写一个接口,然后让这些需要方法的类实现此接口,但是如果目 标类非常复杂,牵一发而动全身,改动的话可能非常麻烦。此时就可以使用此注解,然后建一 个代理类,同时代理该类和目标类。

(二) 作用

用于给被增强的类提供新的方法。(实现新的接口),换句话说,之前的案例中实现代理对象只代理了一个接口,现在可以代理多个接口。

(三) 属性

value: 用于指定目标类型的表达式。当在全限定类名后面跟上+时,表示当前类 及其子类
defaultImpl: 指定提供方法或者字段的默认实现类。
在这里插入图片描述
在这里插入图片描述

(四) 两种触发方式

第一种触发方式:在使用时自行强转新引入接口类型,然后调用方法。
在这里插入图片描述
第二种触发方式:在通知类中,使用this关键字,引入新目标类对象,调用方法 触发。
在这里插入图片描述

@EnableLoadTimeWeaving

(一) Weaving(织入)

指把增强应用到目标对象来创建新的代理对象的过程。 spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

(二) 作用

用于切换不同场景下实现增强。

(三) 使用场景

在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类 加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入 到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切 面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。 AspectJ提供了两种切面织入方式,第一种通过特殊编译器,在编译期,将AspectJ 语言编写的切面类织入到Java类中,可以通过一个Ant或Maven任务来完成这个操作;第二种 方式是类加载期织入,也简称为LTW(Load Time Weaving)

@EnableAspectJAutoProxyexposeProxy属性和proxyTargetClass属性
weixin_44941128的博客
12-15 1587
把@EnableAspectJAutoProxyexposeProxy设为true,是暴露代理对象的意思,也就是可以通过设置这个属性,用AopContext.currentProxy()的方式获取到当前的代理对象,可以解决同一类中两个方法相互调用是aop不生效的问题 @Component public class MessageService { public String showMessage(String info) { System.out.println(".
springproxy-target-class详解
热门推荐
shaoweijava的博客
08-01 5万+
proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。首先说明下proxy-target-class="true"和proxy-target-class="false"的区别,为true则是基于类的代理将起作用(需要cglib库),为false或者省略这个属性,则标准的JDK 基于接口的代理将起作用。 proxy-target-classspring事务、aop、缓
Spring AOP注解开发详解
最新发布
xiaotiaoza的博客
04-24 876
概念:指的是遵循特定的语法用于捕获每一个种类的可使用连接点的语法。作用:用于对符合语法格式的连接点进行增强。
Spring-AOP
Andy_Health的博客
04-03 889
AOP 入口 通过扫描注解@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)注册了AOP 入口类,具体看看注解里面的 @Import(AspectJAutoProxyRegistrar.class) proxyTargetClass true 1、目标对象实现了接口– 使用CGLIB 代理机制 2、目标对象没有接...
proxyConfig源码分析】【proxyTargetClass】【exposeProxy
wt_better的博客
12-03 1385
本文转载自shysheng:spring proxyConfig源码分析 我们知道,ProxyConfig是所有产生Spring AOP代理对象的基类,它是一个配置源,主要为其AOP代理对象工厂实现类提供基本的配置属性。 它一共包含5个属性,本文主要就是分析这5个属性在产生代理对象过程中的具体作用。 ProxyConfig包含的5个属性如下: public class ProxyConfig ...
基础9:注解详解(AOP
狼行千里吃肉
07-31 778
基础 这里回顾一下前期学习的AOP知识,其中AOP的核心知识点就是2个:AspectJ表达式、通知; 其中通知分为5类:before前置通知、after后置通知、afterrunning返回通知、afterthrowing异常通知、around环绕通知; 这5种类型的通知也对应着5种类型的注解: @Before前置通知、@After后置通知、@AfterReturning返回通知、@AfterThrowing异常通知、@Around环绕通知; 这5个注解的参数,就是切入表达式,这里可以参考之前写的
Spring-AOP常用注解
乐嘉工作室
03-28 523
Spring-AOP常用注解
Spring注解驱动开发第33讲——AOP原理总结
08-06
Spring注解驱动开发第33讲——AOP原理总结
Spring注解驱动AOP功能测试
08-19
Spring注解驱动AOP功能测试 Spring框架提供了一个强大的功能,即Aspect-Oriented Programming(面向方面编程),也就是AOPAOP是一种编程范式,它提供了一种将横切关注点模块化的方法,例如日志记录、安全检查...
Spring高级之注解驱动开发视频教程
11-05
它推出的一套注解,可以降低开发人员的学习成本,从而更轻松的做表现层开发。同时,在3.x版本之后,它开始之初Rest风格的请求URL,为开发者提供了开发基于Restful访问规则的项目提供了帮助。 SpringData是一组技术...
使用Spring注解方式实现AOP实例
08-30
使用Spring注解方式实现AOP实例 使用Spring注解方式实现AOP实例是指通过使用Spring框架提供的注解方式来实现Aspect-Oriented Programming(面向方面编程)的功能。AOP是面向对象编程的一种补充,能够将跨越多个...
springAOP 注解开发示例详解
08-31
本文将深入探讨Spring AOP注解开发方式,以帮助读者理解如何使用注解来实现切面。 首先,我们需要了解AOP的基本概念: 1. **通知(Advice)**:通知定义了切面何时被调用。Spring支持五种类型的通知: - **...
aop注解
qq_46210699的博客
07-23 486
基于注解aop开发步骤: ①创建目标接[门和目标类(内部有切点) ②创建切面类(内部有增强方法) ③将目标类和切面类的对象创建权交给spring ④在切面类中使用注解配置织入关系 ⑤在配置文件中开启组件描和AOP的自动代理 ⑥测试 接口 public interface TargetInterface { public void save(); } 实现类 @Component("Target") public class Target implements TargetInterface {
Springaop注解实现
qq_47455973的博客
02-28 3629
Spring中的AOP1.什么是AOP2.怎么实现AOP# 2.1AOP相关的注解介绍# 2.2实现AOP的xml配置# 2.3实现AOP# 2.4对相同切入点的公共化# 2.5设置多个增强类的优先级 1.什么是AOP Aop是java的spring框架中的一种特性,aop是面向切面编程的缩写,那什么是面向切面编程呢? 面向切面编程就是,在不对源码进行修改的情况下对源码所实现的功能进行增强。 举例说明 原本一个程序可以实现用户登入的功能,然后我想在这个功能的基础上,加入一个新的功能,就是对用户等级的判断,按
从@EnableAspectJAutoProxy一起看AOP源码
LiuEP的博客
10-25 241
通过EnableAspectJAutoProxy注解,观察Spring AOP 在背后做了哪些事情。
AOP(三)之AfterThrowing增强处理
qq_40179479的博客
11-30 2679
@AfterThrowing 使用@AfterThrowing注解可以修饰AfterThrowing增强处理,AfterThrowing增强处理主要用于处理程序中未处理的异常。使用@AfterThrowing注解时可指定如下的常用属性: pointcut/value:这两个属性的作用是一样的,它们都用于指定该切入点对应的切入表达式。一样既可是一个已有的切入点,也可以直接定义切入点表达式。当指定了...
登录拦截场景-多种实现方式
chuyouyinghe的专栏
10-26 1171
除开一些集成困难,有兼容性的一些方案之外,其他的这些方案都是可以用的了,剩下的我们需要考虑的就是,此方案是否有更大的内存开销,是否有内存泄露风险,需要处理页面意外关闭的情况吗?本文是一个总纲或者说是总结,这里的几种方法我都只是简单的介绍了一下,具体的使用可以看看单独的文章,每一篇具体使用的方式之前都已经出了对应的文章,并附带了Demo,有兴趣的朋友可。相对其他的方案,此方案的思路就比较清奇,利用线程的等待与恢复来实现,当我们跳转到登录页面的时候我们让线程等待,然后等待登录完成之后我们再恢复等待。
SpringBoot应用篇】【AOP+注解SpringBoot使用Aspect AOP基于注解获取方法形参
输入技术、输出想法
04-04 1463
需求: 需要保存的日志内容在方法的参数中,并且方法参数的类型对象不一样,且对象的属性名称不一样。这一篇文章已经给出了解决方法。但是如果方法的参数不同,会出来转换器类爆炸的情况。问题:Java反射中Parameter的getName后得到arg0的问题。1、@LogPro注解中添加field目标属性字段。2、LogAspectPro切面增强。
Spring常用注解及其作用
m0_48038376的博客
09-02 1万+
Spring常用注解及其作用 1.@Component 它是这些注解里面最普通的一个注解,一般用于把普通pojo实例化到spring容器中。 @Controller和@Service和@Repository是它的特殊情况,当一个类不需要进行这几种特殊归类的时候,只是作为一个普通的类,被Spring管理就OK的时候,比较适合采用@Component注解。 原理:将普通JavaBean实例化到spring容器中,Spring容器统一管理,用起来不用自己new了,相当于配置文件中的< bean id=""
aop 的几个关键注解
05-05
AOP(Aspect-Oriented Programming,面向切面编程)是一种程序设计思想,它通过将应用程序分解为不同的关注点(即切面),从而提高代码的模块性和可维护性。在Java中,AOP的实现依赖于注解。下面是几个关键的注解: 1. @Aspect:用于定义切面类,其中可以包含切点和通知。 2. @Pointcut:用于定义切点,即需要在哪些方法或类上应用切面。 3. @Before:在目标方法执行前执行通知。 4. @After:在目标方法执行后执行通知。 5. @AfterReturning:在目标方法返回值后执行通知。 6. @AfterThrowing:在目标方法抛出异常后执行通知。 这些注解可以结合使用,从而实现更灵活的AOP编程。例如,可以使用@Aspect和@Pointcut定义切面,然后使用@Before、@After等注解定义通知。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Python数据分析基础——CSV文件——筛选特定的行 9997
  • Python数据分析基础——CSV文件——读取多个CSV文件 7527
  • Python数据分析基础——CSV文件——选取特定的列 7135
  • Python数据分析基础——CSV文件——添加标题行 5450
  • 链表——找出最大值与最小值 4196

分类专栏

  • 部署运维 1篇
  • 数据库 10篇
  • 重学数据结构 1篇
  • 性能优化 1篇
  • RabbitMQ 1篇
  • SpringCloud 1篇
  • GO 7篇
  • JMX 1篇
  • Java虚拟机 1篇
  • Kotlin 2篇
  • Redis 1篇
  • 贪心算法 1篇
  • 交流社区项目总结 1篇
  • Mybatis 8篇
  • JAVA 24篇
  • SpringBoot
  • SSM整合
  • Spring 5篇
  • SpringMVC 1篇
  • BUG 1篇
  • JavaWeb 1篇
  • 数据结构 7篇
  • 鸿蒙开发 4篇
  • 网络爬虫
  • python数据分析 12篇

最新评论

  • Python数据分析基础——图与图表——matplotlib

    claire__zhao: marker=r'o', color=u'blue' 和 marker='o', color='blue' 相比,多了一个 r 和 u,r 和 u 分别代表什么呢?

  • Python数据分析基础——CSV文件——添加标题行

    北搭“: 请问如果我想将原有的标题行替换成我想要的内容,应该怎么做呢

  • Mysql——存储引擎

    BenjaminQA: 好文章,学习了,收藏。 2022-02-10 10:23:38

  • Mysql——存储引擎

    睿思达DBA_WGX: 不错不错,收藏起来。

  • Javase——异常

    u012804784: 紫罗兰与海棠,Javase——异常,,同为博客爱好者,欢迎博主回访本人专栏!

大家在看

  • 智能优化算法应用:基于差分进化算法PID参数优化 - 附代码 504
  • Python 获取class_name win32gui
  • linux下C语言如何操作文件(五) 26
  • Python编程学习进阶书籍 1052
  • AWS无服务器 应用程序开发—第十五章 CI/CD 588

最新文章

  • Vuepress适配markdown相关问题
  • Linux安装MySQL
  • 【数据结构】链表
2023年5篇
2022年23篇
2021年69篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司民治优化福永网站推广系统塘坑百度爱采购宝安seo排名大鹏网站优化塘坑建网站永湖关键词按天收费石岩百度标王福永网站设计龙华网站关键词优化横岗至尊标王深圳百姓网标王推广双龙模板网站建设双龙模板制作丹竹头seo优化同乐网站seo优化东莞模板制作大芬seo网站推广坂田至尊标王东莞网站搜索优化南澳建网站观澜网站搜索优化塘坑推广网站坪山百度网站优化西乡seo网站优化爱联SEO按天收费龙岗网站搜索优化松岗网站改版坪山网站优化排名盐田网站优化按天收费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化