Springboot 中AOP的使用

面向切面编程(Aspect Oriented Programming) 是软件编程思想发展到一定阶段的产物,是面向对象编程的有益补充。AOP一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能检测等。

日志、异常处理、事务控制等都是一个健壮的业务系统所必须的。但是为了保证系统健壮可用,就要再众多业务方法中反复编写类似的代码,使得原本就很复杂的业务处理代码变得更加复杂。业务功能的开发者还要考两次这些额外的代码是否处理正确,是否有遗漏的地方,如果需要修改日志信息的格式或者安全验证的规则,或者再增加辅助功能,都会导致业务代码频繁而大量的修改。

面向切面编程,就是在不改变原程序的基础上为代码增加新的功能,对代码段进行增强处理。他的设计思想来源于代理设计模式。

1.在原对象方法之前插入的增强处理为前置增强

2.该方法执行完以后插入的增强处理为后置增强

3.环绕在方法前后的增强处理为环绕增强,是最强大的增强处理,可以获取或者修改目标方法的参数、返回值、异常处理、甚至决定目标方法是否执行。

4.该方法抛出异常时的增强处理为异常抛出增强

5.最终增强处理,无论方法抛出异常还是正常退出都会得到执行,类似于异常处理机制中finally块的作用,一般用于释放资源

在Springboot中使用注解

需要引入所需要的jar :spring-boot-starter-aop

创建一个aop增强处理类

@Slf4j
@Aspect
@Component
public class LoggerAspect {

    // 匹配 com.lzz.lzzapp.common.user包及子包下所有类的所有方法
    @Pointcut("execution(* com.lzz.lzzapp.common.user..*.*(..))")
    public void logPointCut(){

    }
    //前置增强 在连接点执行之前执行的通知
    @Before("logPointCut()")
    public void before(){
        log.info("即将调用业务方法");
    }
    //最终增强 在连接点执行之后执行的通知(返回通知和异常通知的异常)
    @After("logPointCut()")
    public void after(){
        log.info("业务方法调用完成");
    }

    /**
     * 后置增强 在连接点执行之后执行的通知(返回通知)
     */
    @AfterReturning(value="logPointCut()",returning="result")
    public void doAfterReturning(JoinPoint joinPoint, Object result){
        String methodName = joinPoint.getSignature().getName();
        log.info("调用"+joinPoint.getTarget()+"的"+methodName+"方法。参数:"+Arrays.toString(joinPoint.getArgs())
                +"。方法返回值:"+result);
    }

    /**
     * 异常增强 在连接点执行之后执行的通知(异常通知)
     */
    @AfterThrowing("logPointCut()")
    public void doAfterThrowing(){
        log.info("异常处理完成");
    }

    /**
     * 环绕增强
     */
    @Around("logPointCut()")
    public void doAround(ProceedingJoinPoint jp){
        log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。参数:"+Arrays.toString(jp.getArgs()));
        try {
            Object result=jp.proceed();//执行目标方法
            log.info("方法返回值:"+result);
        }catch (Throwable e){
            log.error(jp.getSignature().getName()+"方法发生异常");
            e.printStackTrace();
        }
    }

}

使用@Aspect定义切面,@Pointcut定义切入点

切入点匹配的执行点为连接点为JointPoint,Spring会自动注入该实例,通过joinpoint 的getTarget()方法可以得到被代理对象,getSignature()方法返回被代理的目标方法。getArgs()方法返回传递给目标方法的参数数组

对于后置增强,还可以定义一个用于接收被代理方法的返回值,必须在 @AfterReturning 注解中通过returning 属性指定该参数的名称

execution是切入点指示符,他括号中是一个切入点表达式,可以配置要切入的方法,切入点表达式支持模糊匹配

public * addUser(com.entity.User)     * 表示匹配所有类型的返回值
public void *(com.entity.User)           * 表示匹配所有方法名
public void addUser(..)                     .. 表示匹配所有参数个数和类型
* com.user.*.*(..)               表示匹配com.entity包下所有类的所有方法
* com.user..*.*(..)              表示匹配com.entity包及其子包下所有类的所有方法

原文地址:https://www.cnblogs.com/double-yuan/p/12101231.html

时间: 2024-10-09 04:40:05

Springboot 中AOP的使用的相关文章

Springboot中AOP统一处理请求日志

完善上面的代码: 现在把输出信息由先前的system.out.println()方式改为由日志输出(日志输出的信息更全面)

SpringBoot中使用LoadTimeWeaving技术实现AOP功能

目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现AOP的例子 3. 参考资料 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 AOP--面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强.按切面被织如到目标类中的时间划分,主要有以下几种: 1.运行期织入 这是最常见的,比如在运行期通过为目标类生成动态代理

springboot中的AOP开发

三步: 1.引入springboot-boot-start-aop jar包 <!--springboot与aop集成jar包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 2.开发切面 两个主要的注解:@Configurat

Spring全家桶——SpringBoot之AOP详解

Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. 准备工作 首先,使用AOP要在build.gradle中加入依赖 //引入AOP依赖 compile "org.springframework.boot:spring-boot-starter-aop:${springBootVersion}" 然后在application.yml中

SpringBoot中异步请求和异步调用(看这一篇就够了)

一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应.一句话:增加了服务器对客户端请求的吞吐量(实际生产上我们用的比较少,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲). 2.异步请求的实现 方式一:Servlet方式实现异步请求

springboot中使用自定义线程池ThreadPoolTaskExecutor

java5以后,线程有了很大的变化,在使用上更加方便功能更佳强大,Springboot里面进行了进一步的封装. 我们来看一个例子 package com.executor; import java.util.concurrent.Executor;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor; import org.springframewor

spring boot 中AOP的使用

一.AOP统一处理请求日志 也谈AOP 1.AOP是一种编程范式 2.与语言无关,是一种程序设计思想 面向切面(AOP)Aspect Oriented Programming 面向对象(OOP)Object Oriented Programming 面向过程(POP) Procedure Oriented Programming 再谈AOP 1.面向过程到面向对象 2.换个角度看世界,换个姿势处理问题 3.将通用逻辑从业务逻辑中分离出来 二.处理过程 个人理解,其实就是日志体系为了方便使用,可以

springboot添加AOP日志配置

目录 1,在pom.xml配置文件中添加以下配置 2,自定义配置文件logback.xml,该配置文件位置在templates文件夹下第一层,和html文件夹位置并列. 3,logback.xml文件配置内容 4,写一个LogUtil类 @(springboot添加aop) 1,在pom.xml配置文件中添加以下配置 <!--spring aop 包--> <dependency> <groupId>org.springframework.boot</groupI

SpringBoot—集成AOP详解(面向切面编程Aspect)

AOP介绍 AOP概述 ??AOP是Aspect-Oriented Programming,即为面向(切面)方面编程.在维基百科中的解释:Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.从关注点中分离出横切关注点是面向切面的程序设计核心概念.分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑代码不需要再包含针对特定领域问题代码的调用,比如一些公用模块的日志.安全等代码. ??代码通过切面抽离,更加整齐和清晰,将重复的代码抽取出来单独的进行维护,在需要