Spring AOP配置 之 @Aspect

android广告SDK原理详解(附源码) 广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告位代码,集成他们的广告SDK包。然后谋事在人,成事在天,只有每天看报表查查收益。   也有一些开发者为了能够提高自己的变现水平,同时接入了好几家的sdk,哪家出的收益高一点我就出哪家的广告,但是这 阅读详情

@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

LVGL v8学习笔记 | 09 - 进度条控件的使用方法(bar) lv_bar_set_range必须放在lv_bar_set_mode前面,否则不生效。bar对象的API在lv_bar.h中声明,以lv_bar_xxx命名。此事件可以用来在进度条更新值之后更新别的控件(比如进度条旁边的文字)。可以看到,默认创建的进度条值是0到100。(3)设置进度条的范围值(最大值和最小值)(2)获取进度条的起始值。(3)获取进度条的最小值。(4)获取进度条的最大值。(1)设置进度条的当前值。(2)设置进度条的起始值。(1)获取进度条当前值。(5)获取进度条的模式。 阅读详情

相关推荐

陀螺仪及四元数解算

陀螺仪 四元数

zb313982521的博客 2004

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

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

Wcybaonier 5143

GROMACS新手必看:从PDB文件到完整分子动力学模拟的保姆级教程

本文提供GROMACS分子动力学模拟的保姆级教程,从PDB文件处理到完整模拟流程全覆盖。详细讲解结构预处理、系统构建、能量最小化、生产模拟等关键步骤,并分享性能优化和结果分析技巧,帮助新手快速掌握分子动力学模拟的核心操作。

yhn456789的博客 763

Spring源码浅析之AOP、Aspect、Advice

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

DaHuangXiao的博客 1469

深度强化学习:Actor-Critic、A2C、A3C

Actor-Critic算法是强化学习中常用的一种方法,policy-based,通过演员和评论员或者是策略网络和价值网络的结合进行学习

weixin_51995147的博客 1427

HFSS仿真的后处理结果,如何根据天线表面的电流密度分布对天线进行优化?

在HFSS仿真中,天线表面的Jsurf​是最直观、最有价值的诊断工具之一。它不仅告诉你天线“能不能工作”,还能告诉你“为什么工作”以及“哪里出了问题”。

degogmy的博客 1157

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

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

wuxioqian0634的博客 1210

9 硬件工程师笔面试高频知识考点真题解析——运算放大器

运算放大器(运放)摘要 运放是一种高增益、差分输入的模拟集成电路,具有虚短(线性区输入电压相等)和虚断(输入电流为零)特性,支持负反馈(线性放大)和开环/正反馈(饱和区比较)两种工作模式。关键特性包括高输入阻抗、低输出阻抗,理想运放参数(如无限增益)与实际参数(如有限带宽)的差异。 选型要点: 信号特性:直流/低频信号关注失调电压(Vos)、温漂;高频信号侧重带宽(GBW)和压摆率(SR)。 电源条件:单/双电源供电、电压范围及功耗需求(如电池设备需低静态电流)。 精度与噪声:微弱信号需低噪声运放,高精度场

XU157303764的博客 1673

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

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

weixin_40004502的博客 1708

ESP-SPARKBOT AI 智能机器人:v1.2 全流程复刻指南

本文介绍 ESP-SPARKBOT AI 智能机器人 v1.2 版本的全流程复刻,包含 PCB 、3D 打印、固件烧录、常见问题解决、参考资料等

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9250

华为OD技术面真题 - Python开发 - 2

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 910

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

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

qq_45395640的博客 271

24、JavaFX MP3 音频播放器开发详解

本文详细介绍了如何使用JavaFX开发一个功能丰富的MP3音频播放器,涵盖文件拖放加载、音频播放控制、音频频谱可视化、进度定位滑块等核心功能,并提供了完整的代码实现和解析。适合希望学习JavaFX多媒体应用开发的开发者参考。

wind6的博客 169

Spring基于@Aspect的AOP配置

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

振宇要低调 236

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

liaomingwu的专栏 4949

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

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

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、付费专栏及课程。

余额充值