千家信息网

SpringAOP的注解方式是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"SpringAOP的注解方式是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringAOP的注解方式是什么"吧!1、概述Spri
千家信息网最后更新 2026年11月02日SpringAOP的注解方式是什么

本篇内容主要讲解"SpringAOP的注解方式是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringAOP的注解方式是什么"吧!

1、概述

SpringAOP不是一门技术而是一种设计思想,称为面向切面编程,是利用横切技术剖析对象内部,将业务之间共同调用的逻辑提取并封装为一个可复用的模块,这个模块被命名为切面(Aspect),该模块减少系统中的重复代码,降低模块间的耦合度,可用于日志、权限认证、事务管理等

2、实现方式

AOP是基于代理实现的,Java默认采用的是JDK动态代理,但是JDK动态代理只能代理接口不能代理类。因此springAOP会在JDK动态代理和CGLIB代理之间进行动态切换。

2.1 代理方式分为两种:动态代理、静态代理

  • 动态代理:在运行时借助于JDk动态代理、CGLIB等再内存中临时临时生成AOP代理类,也被成为运行时增强

  • 静态代理:指使用AOP框架的命令进行编译,从而在编译阶段就可以生成AOP代理类,也被成为编译增强

2.2 代理方式的选择

  • 代理目标对象实现了接口,默认采用JDK动态代理,也可以强制使用CGLIB

  • 代理目标对象没有实现接口,必须使用CGLIB

Spring会自动在JDK动态代理和CGLIB代理直接转换

3、名词解释

  • 切面(Aspect):切面是通知和切点的结合,通知和切点共同定义了切面的全部内容。

  • 通知(Advice):定义了切面何时使用,通知分为以下几种类型

    • 前置通知(Before):在目标方法被调用之前调用通知功能

    • 后置通知(After):在目标方法执行完成之后调用通知,此时不会关心方法的输出是什么

    • 返回通知(After-returning):在目标方法成功执行之后调用通知

    • 异常通知(After-throwing):在目标方法抛出异常后调用通知

    • 环绕通知(Around):在被通知的方法调用之前和调用之后执行自定义的行为

  • 切点(PointCut):定义了在何处应用连接点,通常明确使用在类和方式名称上,或者使用正在匹配或者注解方式

  • 连接点(JoinPoin):连接点是在应用程序运行中能够插入切面的一个点,具体插入方式根据通知的不同而不同

  • 目标对象(Target): 需要被搭理的对象,由切点定义出来的

  • 织入(Weaving):把切面应用到目标对象并创建新的代理对象的过程

    • 编译时织入

    • 类加载时织入

    • 运行时织入

4、具体实现

博主以日志收集为例演示注解方式的实现

4.1 新建springboot项目并映入AOP依赖

  org.springframework.boot  spring-boot-starter-aop

4.2 编写注解类

import java.lang.annotation.*;/** * 日志注解 * * @author chilx */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface LogAnnotation {   /** * 方法名称 */String title() default "";/** * 操作类型 {@link LogTypeConsts} */String type() default "";/** * 操作描述 */String remark() default "";}

4.3 编写切面类

import com.chilx.aop.annotation.LogAnnotation;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;/** * @author chilx * @date 2021/3/31 **/@Aspect@Componentpublic class LogAnnotationAspect {   /** * 切点 */@Pointcut("@annotation(com.chilx.aop.annotation.LogAnnotation)")public void logPointCut() {   }/** * 前置通知: 方法执行前调用 * 注意: 在配置value:的时候可以使用@Annotation(参数名称)的方式来使用我们自定的注解 * 切记前后的参数名称要一致 */@Before(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void before(JoinPoint point, LogAnnotation logInfo) {   // 参数Object[] args = point.getArgs();System.out.println();System.out.println("前置通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 后置通知: 方法执行后调用,若方法出现异常,不执行 */@After(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void after(JoinPoint point, LogAnnotation logInfo) {   System.out.println("后置通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 返回: 方法执行后调用,若方法出现异常,不执行 */@AfterReturning(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void afterReturning(JoinPoint point, LogAnnotation logInfo) {   System.out.println("后置通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 环绕通知: */@Around(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void around(ProceedingJoinPoint point, LogAnnotation logInfo) throws Throwable {   System.out.println("执行方法前");Object proceed = point.proceed(point.getArgs());System.out.println("执行方法后");System.out.println("环绕通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 异常通知:方法抛出异常时执行 */@AfterThrowing(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo,e", throwing = "e")public void afterThrowing(JoinPoint point, LogAnnotation logInfo, Exception e) {   System.out.println("异常通知" + "-->" + logInfo.title() + "--" + logInfo.remark());System.out.println(e.getMessage());}}

4.4 注意事项

1、对于环绕通知使用对象是 ProceedingJoinPoint

2、 在使用类似以下方式时,切记加粗部分的名称要完全一致

@Before(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")

public void before(JoinPoint point, LogAnnotation logInfo) {}

到此,相信大家对"SpringAOP的注解方式是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

代理 方法 方式 动态 注解 对象 目标 切面 切点 名称 模块 编译 运行 内容 参数 接口 日志 连接点 应用 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技企业 为想互联网科技怎么样 互联网属科技 互联网医疗科技 郑州华宇互联网科技 左右互联网络科技 互联网科技生活的内容 成都仁贤领冠互联网科技有限公司 移动互联网科技股 互联网科技革命什么开始 中国航天科技大学国际工业互联网 易企秀互联网科技是做什么的 九思连强互联网电子科技有限公司 萌小萌互联网科技河南有限公司 云鲸互联网络科技有限公司 科技互联网行业投资研究 互联网科技企业商标注意事项 科技信息时代互联网发展 陕西彩京云互联网科技有限公司 小牛互联网科技有限公司地址 金融科技创新监管互联网金融 金融科技 互联网金融 互联网 科技创业 互联网与未来科技 广西拼得多互联网科技有限公司 上海电发互联网科技有限公司 上海宁丞科技互联网 新兴科技互联网创新大赛颁奖典礼 速维有品互联网信息科技(苏州)有限公司 三亚科技创新互联网基地
0