Spring AOP配置 之 @Aspect

linux入侵排查-综合日志分析 2.分析攻击者首次成功登录web管理后台的时间 还可以知道攻击者可能是通过10.2.4.11这个跳板服务器跳过来的,然后我们继续排查,可以发现日志中POST请求大多都是1047字节,然后往后大多是300字节,POST请求的响应状态码有200和302这两个,其中的302是爆破成功后持续爆破产生的日志,再1047字节和300字节中间夹着一个978字节,就是200响应和302响应的中间。7.分析攻击者留下的持久化后门的时间和后门执行情况 排查计划任务,发现有一个计划任务还是被加密的,应该是反弹shell的。 阅读详情

@Aspect

一、AOP概念(百度)
二、AOP基本术语
三、Advice类型
四、Sping @Aspect开发步骤
五、执行顺序
六、试例代码

一、AOP概念(百度)

AOP(Aspect Oriented Programming):面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP是Spring框架面向切面的编程思想,AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。

二、AOP基本术语

  1. Aspect(切面):切面泛指交叉业务逻辑。类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice,如事务处理、日志记录就可以理解为切面。切面实际就是对主业务逻辑的一种增强。
  2. Joint Point(连接点):程序执行的某个特定位置,如类开始初始化前,类初始化后,类某个方法调用前,调用后,方法抛出异常之后。一个类或一段代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为连接点。(指切面可以织入的位置。)Spring仅支持方法的连接点,即只能在方法调用之前,调用之后,方法抛出异常,以及方法调用前后这些连接点织入增强;
  3. PointCut(切点):指切面具体织入的位置。是一组 joint point,这些 joint point
    或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  4. Advice(增强):Advice是切面的一种实现,可以完成简单织入功能(织入功能就是在这里完成的)。通知定义了Advice代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等。Advice类型不同,切入时间不同。
  5. Target(目标对象):织入 Advice 的目标对象.。
  6. Weaving(织入):把切面应用到目标对象来创建新的代理对象的过程。

三、Advice类型

  1. @Before:标识一个前置增强方法。
  2. @After:final增强,不管是抛出异常或者正常退出都会执行。
  3. @AfterReturning:后置增强,方法正常退出时执行。
  4. @AfterThrowing:异常抛出增强,方法执行抛出异常后执行。
  5. @Around:环绕增强,能控制切点执行前,执行后,,用这个注解后,程序抛异常,会影响@AfterThrowing这个注解。

四、Sping @Aspect开发步骤

  1. 添加依赖
	<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjrt</artifactId>
		<version>1.9.2</version>
	</dependency>
	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.9.2</version>
	</dependency>
  1. 配置自动扫描包
<context:component-scan 	base-package="com.test.spring.aop">
</context:component-scan>
  1. 编写切面
    3.1 定义一个类,该类添加了@Component、@Aspect注解
    3.2 定义切点(切点定义方式可参考《Spring AOP配置 之 @PointCut注解》)
    3.3 配置增强,给方法添加@Before、@After、@AfterReturning、@AfterThrowing、@Around等增强配置。
  2. 书写增强方法的具体业务逻辑,通过JoinPoint对象参数,可以获取到方法的签名和方法的参数等信息。

五、执行顺序

  1. @Around环绕通知
  2. @Before通知执行
  3. @Before通知执行结束
  4. @Around环绕通知执行结束
  5. @After后置通知执行了
  6. @AfterReturning第一个后置返回通知后执行

六、试例代码

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.SourceLocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Optional;

@Aspect
@Component
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    // java针对处理对象与json之间关系转换用的
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    // 定义切点
    private final String POINT_CUT = "execution( * com.lzq..controller.*.*(..))";

    @Pointcut(value = POINT_CUT)
    public void pointCut() {
    }

    /**
     * 前置增强方法
     *
     * @param joinPoint
     */
    @Before(value = "pointCut()")
    public void before(JoinPoint joinPoint) {
        logger.info("\n\n----------------- before start -------------");
        // 获取目标方法参数信息
        Object[] args = joinPoint.getArgs();
        if (args.length > 0) {
            logger.info("目标方法参数信息:");
            Arrays.stream(args).forEach(arg -> {
                Optional.ofNullable(arg).ifPresent(a -> logger.info(a.toString()));
            });
        }

        // 获取 AOP 代理对象:CGLib代理和JDK动态代理
        logger.info("AOP 代理对象:");
        Object thisObj = joinPoint.getThis();
        logger.info("-" + thisObj.getClass().getName() + ":" + thisObj.toString());

        // 获取被代理的目标对象
        logger.info("被代理的目标对象:");
        Object object = joinPoint.getTarget();
        logger.info("-" + object.getClass().getName() + ":" + object.toString());

        // 获取连接点Joint Point类型
        logger.info("连接点Joint Point类型:");
        String kind = joinPoint.getKind();
        logger.info("-" + kind);// -method-execution

        // 获取连接点的方法签名对象
        logger.info("连接点的方法签名对象:");
        Signature signature = joinPoint.getSignature();
        logger.info("-" + signature.toLongString());
        logger.info("-" + signature.toShortString());
        logger.info("-" + signature.toString());
        logger.info("-方法名:" + signature.getName());
        logger.info("-获取声明类型 方法所在类的class对象" + signature.getDeclaringType().toString());
        logger.info("-获取声明类型名" + signature.getDeclaringTypeName());

        // 获取连接点方法所在类文件中的位置 打印报异常
        logger.info("连接点方法所在类文件中的位置:");
        SourceLocation sourceLocation = joinPoint.getSourceLocation();
        logger.info("-" + sourceLocation.toString());
        // logger.info("-" + sourceLocation.getFileName());
        // logger.info("-" + sourceLocation.getLine() + "");
        // logger.info("-" + sourceLocation.getWithinType().toString());

        // 返回连接点静态部分
        logger.info("连接点静态部分:");
        JoinPoint.StaticPart staticPart = joinPoint.getStaticPart();
        logger.info("-" + staticPart.toLongString());// execution(public com.lzq.selfdiscipline.business.bean.MessageBean com.lzq.selfdiscipline.business.controller.UserFileManagerController.queryFiles(java.lang.String,java.lang.Integer,java.lang.Integer))

        // attributes可以获取request信息 session信息等
        logger.info("request信息:");
        ServletRequestAttributes attributes =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        logger.info("-" + request.getRequestURL().toString());
        logger.info("-" + request.getRemoteAddr());
        logger.info("-" + request.getMethod());
        logger.info("-" + request.getParameterMap().toString());
        logger.info("----------------- before end -------------");
    }

    /**
     * 后置增强,方法正常退出时执行
     * 如果第一个参数为JoinPoint,则第二个参数为返回值的信息
     * 如果第一个参数不为JoinPoint,则第一个参数为returning中对应的参数
     * returning:限定了只有目标方法返回值与通知方法参数类型匹配时才能执行后置返回通知,否则不执行,
     * 参数为Object类型将匹配任何目标返回值
     *
     * @param joinPoint
     * @param result
     */
    @AfterReturning(value = "pointCut()", returning = "result", argNames = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("----------------- afterReturning -------------" + result);
    }

    /**
     * 异常抛出增强,方法执行抛出异常后执行。
     * 定义一个名字,该名字用于匹配通知实现方法的一个参数名,当目标方法抛出异常返回后,将把目标方法抛出的异常传给通知方法;
     * throwing:限定了只有目标方法抛出的异常与通知方法相应参数异常类型时才能执行后置异常通知,否则不执行,
     * 对于throwing对应的通知方法参数为 Throwable 类型将匹配任何异常。
     *
     * @param joinPoint
     * @param exception
     */
    @AfterThrowing(value = "pointCut()", throwing = "exception")
    public void afterThrowing(JoinPoint joinPoint, Throwable exception) {
        System.out.println("----------------- afterThrowing -------------");
        if (exception instanceof NullPointerException) {
            logger.info("空指针异常");
        }
    }

    /**
     * final增强,不管是抛出异常或者正常退出都会执行。
     */
    @After(value = "pointCut()")
    public void after(JoinPoint joinPoint) {
        System.out.println("----------------- after -------------\n\n");
    }

    /**
     * 环绕通知:
     * 注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用
     * 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。
     * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型
     *
     * @param proceedingJoinPoint
     * @return
     */
    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) {
        MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
        // 获取当前方法对象
        Method method = methodSignature.getMethod();
        Object obj = null;
        try {
            // 调用下一个advice或者执行目标方法,返回值为目标方法返回值,因此可以通过更改返回值,修改方法的返回值
            // 如:修改obj,然后将obj返回
            obj = proceedingJoinPoint.proceed();

            /*Object[] args = new Object[] {};
            // //参数为目标方法的参数 因此可以通过修改参数改变方法入参
            obj = proceedingJoinPoint.proceed(args);*/
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return obj;
    }
}

————————————————
版权声明:本文为优快云博主「普通人zzz~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_33375499/article/details/105492581

YOLOv11全方位改进指南:卷积层、轻量化、注意力、损失函数等创新优化一览 YOLOv11通过八大核心模块的创新设计,在保持YOLO系列实时性的同时显著提升检测精度。本文提出的可变形卷积DCNv4多模态注意力动态解耦头等创新方案,已在工业质检、自动驾驶、无人机巡检等领域成功应用。完整项目地址预训练模型:包含从nano到x六个规格在线演示创新声明首次在YOLO系列集成DCNv4,小目标检测AP提升8.2%提出多模态混合注意力(MMAttention),兼顾通道与空间关系动态标签分配策略使训练效率提升40% 阅读详情

相关推荐

‌NTRU算法详细教程 | 2025年最新版(基于NIST后量子密码标准更新)

‌:NTRU是当前抗量子加密的黄金标准,‌。

blns_yxl的博客 1802

切面(Aspect)获取ServletRequest请求参数和返回值

可以获取到ServletRequest里面的参数,这里记录一下,以后可能用得着,哈哈哈。

Wcybaonier 5143

Oracle19c SYSAUX表空间爆满?手把手教你清理SM/ADVISOR和AUDSYS占用(附完整SQL)

本文详细解析了Oracle19c中SYSAUX表空间爆满的常见原因及解决方案,重点针对SM/ADVISOR和AUDSYS组件的空间占用问题提供了完整的SQL清理脚本。通过诊断查询、空间清理和预防性维护策略,帮助DBA有效管理SYSAUX表空间,确保数据库稳定运行。

weixin_28338005的博客 236

Spring源码浅析之AOP、Aspect、Advice

前言 理一理AOP与切面(Aspect)、通知(Advisor)的关系 概念 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。 切点(PointCut): 可以插入增强处理的连接点。 切面(Aspect): 切面是通知和切点的结合。 做了张图 PointCut:指的是具体

DaHuangXiao的博客 1469

STM32 使用rtthread的DMA 串口发送失败

在一次使用RTthread的DMA 串口发送时,持续性通过DMA 发送串口数据时,偶发发送过程中后续数据包无法正常发送出去,后经查,发现为RT-Thread的串口中断处理有瑕疵,后做出修改。另,为了更方便的排查为题,建议修改。左为修改前,右为修改后。

qq_39294918的博客 1108

CST实战:变容二极管电容曲线提取全流程(附S参数设置技巧)

本文详细介绍了在CST Studio Suite中提取变容二极管电容-电压(C-V)曲线的完整实战流程。重点解析了S参数仿真的核心原理、DCFEED模块的正确配置、参数扫描的设置技巧,并探讨了集成SPICE模型进行精确仿真的方法,帮助射频工程师高效、准确地获取器件关键特性。

weixin_29237635的博客 529

Spring AOP概念Aspect、Advice、JoinPoint、JoinCut与Execution

1.什么是 AOP 面向切面编程 2.Aspect(切面) aspect 由 pointcount 和 advice 组成,Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中 AOP的工作重心在于如何将增强织入目标对象的连接点上, 这里包含两个工作: 如何通过 pointcut 和 advice 定位到特定的 joinp...

wuxioqian0634的博客 1210

【教程4>第2章>第18节】 GMSK调制系统的FPGA开发与matlab对比验证

GMSK(高斯最小频移键控)是一种连续相位的频移键控(CPFSK)调制方法,它在数字通信中得到了广泛应用,特别是在移动通信系统中。GMSK通过限制频率偏差的累积来减少带外辐射,并通过使用高斯滤波器对。

FPGA/MATLAB学习教程/源码/项目合作开发 998

spring中的@aspectj切点表达式函数都有哪些_详解Spring AOP 中 @Aspect 的高级用法

1 切点复合运算支持在切点定义中加入以下运算符进行复合运算:2 切点命名一般情况下,切点是直接声明在需要增强方法处,这种切点的声明方式称为匿名切点,匿名切点只能在声明处被使用 。 如果希望在其它地方可以重用这个切点,我们可以通过 @Pointcut 注解及切面类方法来命名它。public class NamePointcut { /** * 切点被命名为 method1,且该切点只能在本类中使用 ...

weixin_40004502的博客 1708

【推荐100个unity插件之24】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

【推荐100个unity插件之23】实现2d交互式草树叶和随风飘动的效果——pixelgraphics插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1682

五种音频器件综合对比——《器件手册--音频器件》

音频器件当在蜂鸣片的两片电极之间接通交流音频信号时,蜂鸣片会根据信号的大小和频率发生振动,从而产生相应的声音。结构简单、造价低廉。广泛应用于玩具、电子表、电子仪器、电子钟表、定时器等电子电器方面。蜂鸣器是一种一体化结构的电子讯响器,采用直流电源供电,广泛应用于各种电子产品中作发声器件有源蜂鸣器:内部带震荡源,通电即发声,程序控制方便。无源蜂鸣器:内部不带震荡源,需用方波驱动,声音频率可控,价格相对便宜。计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品。

XU157303764的博客 1535

spring 注解 之 AOP基于@Aspect的AOP配置

Spring AOP面向切面编程,可以用来配置事务、做日志、权限验证、在用户请求时做一些处理等等。用@Aspect做一个切面,就可以直接实现。 在spring AOP中业务逻辑仅仅只关注业务本身,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。 相关注...

qq_45395640的博客 271

手把手教你学Simulink实例--基于Simulink的电力电子系统电池管理系统(BMS)设计与仿真实例

本文详细介绍了基于Simulink的电池管理系统(BMS)设计与仿真全过程。首先阐述了BMS在安全防护、寿命延长和性能优化方面的必要性,分析了新能源汽车、光伏储能等典型应用场景的技术指标要求。接着详细讲解了Thevenin等效电路和多电平电池模型构建方法,并给出SOC估算、故障诊断等核心算法的MATLAB实现代码。通过设计正常充放电、过充保护等多场景仿真测试,验证了系统在SOC跟踪精度(误差<1.5%)和故障响应速度(<10ms)方面的优异性能。文章还提出了参数优化方法和未来AI融合、数字孪生等发展方向,提

xiaoheshang_123的博客 377

Spring基于@Aspect的AOP配置

Spring AOP面向切面编程,可以用来配置事务、做日志、权限验证、在用户请求时做一些处理等等。用@Aspect做一个切面,就可以直接实现。

振宇要低调 236

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

spring aop切面编程@Aspect、@Around注解方式配置

spring aop切面编程@Aspect、@Around注解方式配置

liaomingwu的专栏 4949

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring框架 基于@Aspect的AOP配置(六)

Spring除了支持Schema方式配置AOP,还支持注解方式:使用@Aspect来配置   (1)  Spring默认不支持@Aspect的切面声明,必须在applicationContext.xml文件中如下配置     开启@Aspect支持:       (2)通过以上配置,Spring就能发现用@Aspect注解的切面内并把它应用到目标对象上

分享我的点点滴滴,在成长路上与你同行! 503

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring 注解 之 AOP基于@Aspect的AOP配置

Spring AOP面向切面编程,可以用来配置事务、做日志、权限验证、在用户请求时做一些处理等等。用@Aspect做一个切面,就可以直接实现。 1.首先定义一个切面类,加上@Component @Aspect这两个注解 @Aspect @Configuration //或者@Component public class InterfaceLogAspect { p...

weixin_38987366的博客 489

Spring AOP 注解开发详解:从 XML 配置迁移到 @Aspect 实现原理

/project>@Component@Bean位置类上方法上创建方式Spring自动扫描创建开发者手动创建控制权Spring开发者适合对象自己编写的类第三方类是否需要@ComponentScan需要不需要常见场景。

2401_88597484的博客 203

spring boot注解之AOP基于@Aspect的AOP配置

Spring AOP面向切面编程,可以用来配置事务、做日志、权限验证、在用户请求时做一些处理等等。用@Aspect做一个切面,就可以直接实现。 1.首先定义一个切面类,加上@Component @Aspect这两个注解 @Component @Aspect public class LogAspect { private static final Logger logger =...

weixin_36573577的博客 378

Spring Aop实例(AOP 如此简单)@Aspect、@Around 注解方式配置

 转载 ,原文博客地址 : https://www.jianshu.com/p/9517c90db0d4   运行工程 运行具有Main函数的 App.java 得到如下输出 method start time:1480223298250 userHello method end time:1480223299250 项目详解 从App.java入手 App.java pac...

余_小凡 的博客 1万+

@aspect注解_Spring基于注解的AOP配置

操作步骤:pom.xml导入解析切入点表达式依赖 <dependency> <groupId>org.aspectjgroupId> <artifactId>aspectjweaverartifactId> <version>1.8.7versio...

weixin_39778003的博客 277

spring注解---AOP基于@Aspect的AOP配置

Spring AOP面向切面编程,可以用来配置事务、做日志、权限验证、在用户请求时做一些处理等等。用@Aspect做一个切面,就可以直接实现。 1.首先定义一个切面类,加上@Component @Aspect这两个注解 @Component @Aspect public class LogAspect { private static final Logger logger = LoggerFactory.getLogger(LogAspect.class); private ...

qq_38229263的博客 616

Spring源码学习(十七)--基于注解@Aspect配置方式进行Aop测试

基于注解@Aspect配置方式进行Aop测试一. 被代理的目标对象接口二. 接口的实现类三. 使用注解实现AOP(正则表达式)四. XML配置文件进行注解配置处理五. 测试结果 一. 被代理的目标对象接口 目标对象接口 package com.xizi.service; public interface UserService { public void add(String name, int age); public void update(String name, int a

406

Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置

总结: 理解AOP@Before,@After,@AfterReturning,@AfterThrowing执行顺序 实现AOP的切面主要有以下几个要素: 使用@Aspect注解将一个java类定义为切面类 使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。 根据需要在切入点不同位置的切入内容 使用@Before在切入点开始处切入内容 使用@After在切入点结尾处切入内容 使用@AfterReturning在切入点return内容之后

weixin_39280774的博客 1225
上一篇: jstack排除java进程中cpu占用高
下一篇: 自定义注解
Persistence___
博客等级 码龄8年 47粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值