Springboot整合AOP

摘要:
基于CGLIB,类和接口都可以被代理。当未使用引导框架而使用SSM时,我们需要将以下配置添加到配置文件中。将配置类与切入点相结合。现在进入主题,了解boot如何集成AOP。

AOP:Spring得核心之一,面向切面编程,底层是通过动态代理实现得。实现方式有两种:(1)基本JDK原生动态代理,被代理得类需要实现接口。  (2)基于CGLIB,类和接口都可以代理。

在没有使用boot框架时,使用ssm时,我们需要在配置文件中加上以下配置。    (1)配置切入点。 (2)编写切面类。  (3)将配置类与切入点结合。

Springboot整合AOP第1张          Springboot整合AOP第2张

 现在进入主题,看看boot是如何整合AOP得(boot是2.1.9版本)。

(1)引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

(2)配置yml

spring:
  aop:
    #采用CGLIB作为作为动态代理,默认true  为了解决使用 JDK 动态代理可能导致的类型转化异常而默认使用 CGLIB (boot1.x版本默认是false)
    proxy-target-class: true
    #是否开启aop自动配置,默认为true
    #意味着自动加上 @EnableAspectAutoProxy 注解
    #该注解用于开启AOP相关注解得支持
    auto: true

(3)编写业务方法

Springboot整合AOP第3张

 (4)编写切面类

/**
 * @ClassName
 * @Description
 *
 * @Autor wcy
 * @Date 2020/11/6 13:31
 */
//用于定义一个切面类,切面类上面需要加上@Component才可以生效
@Aspect
@Component
public class AspectController {

   private static final Logger log = LoggerFactory.getLogger(WebController.class);

    /**
     * Pointcut定义切入点,一般为方法级别,通过表达式提现。  匹配springbootaop.demo.controller下面所有得公用方法
     */
    @Pointcut("execution(public * com.example.demo.controller..*.*(..))")
    public void aspect(){};

    /**
     *  @Around("aspect()") 这种定义切入点方式和直接在@Around里面声明具体得切入点表达式一样
     * 环绕通知,更灵活得自定义增强通知,可以注入ProceedingJoinPoint获取相关信息和执行方法
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("aspect()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object object = null;
        log.info("环绕通知开始");
        object =  joinPoint.proceed();
        log.info("环绕通知结束");
        return object;
    }

    /**
     *用于在切入点的流程执行前生效,可以在方法中注入JoinPoint用于获取相关信息
     * @param joinPoint
     */
    @Before("aspect()")
    public void before(JoinPoint joinPoint){
       log.info("我是前置通知");
    }

    /**
     * finally通知,这就意味着无论如何都会执行这个通知(不论是否发生异常),可以在方法中注入JoinPoint用于获取相关信息
     * @param joinPoint
     */
    @After("aspect()")
    public void after(JoinPoint joinPoint){
        log.info("我是finally通知");
    }

    /**
     * 异常通知,出现异常时执行,可以在方法中注入JoinPoint和Throwable用于获取相关信息
     */
    @AfterThrowing("aspect()")
    public void throwing(){
        log.info("我是异常通知");
    }

    /**
     * 后置返回前通知 ,在finally通知之后,方法正常退出前执行,可以注入JoinPoint 和Object 获取相关信息和方法执行成功的返回结果
     * @param object
     */
    @AfterReturning(pointcut = "aspect()",returning = "object")
    public void returning(Object object){
        log.info("我是后置通知,响应结果为:"+object);
    }

}

(5)进入测试,界面输入http://localhost:8080/test1,控制台输入如下

Springboot整合AOP第4张

从结果中我们可以看到,当所有通知都存在时,执行顺序如下:

 Springboot整合AOP第5张

 至此boot整合aop也就结束了,此外不同版本得boot,执行顺序也是不一样得,我之前也试了2.3.5得版本,执行得顺序是不同得,这里我就不做说明了,下图便是2.3.5版本得执行顺序。

Springboot整合AOP第6张

免责声明:文章转载自《Springboot整合AOP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇区块链的共识算法:整体介绍 及 分叉 的通俗讲解(一)ApexSQL Log中的Redo Script跟原始SQL不一致问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

bochs使用指南

Bochs是用C++开发的一个模拟器,模拟整个PC。它完全是靠软件模拟来实现的。从启动到重启,包括PC的外设键盘,鼠标,VGA卡,磁盘,网卡等,全部都是有软件来模拟的,因此它非常的适合开发操作系统。 Bochs安装: 双击安装文件,点下一步完成软件安装。 Bochs的配置 bochs的安装目录下为我们提供了一个配置文件的模版bochsrc-sample.t...

ceph介绍

  一、Ceph简介:         Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。在国内一些公司的云环境中,通常会采用 ceph 作为openstack 的唯一后端存储来提高数据转发效率。        Ceph项目最早起源于Sage就读...

Windows10 +Ubuntu 18.04双系统安装详细教程

前言: 由于开发需要,很多用户需要安装Linux环境。如果用虚拟机操作会消耗大量内存,一般的电脑会显得卡顿,从而影响开发效率。这里分享一些安装经验,希望能够帮助大家。 教程: 步骤1:下载镜像文件 从Ubuntu官网 http://releases.ubuntu.com/18.04/下载系统的iso镜像文件 ,下载后不用解压,过程如下: 步骤2:格式化U...

劳德巴赫下载kernel和文件系统时问题

用劳德巴赫下载 kernel  dtb rootfs BOOT.bin 报错(记了个大概) Bad CRC Ramdisk image is corrupt or invalid 记得之前有人和我说rootfs有大小限制,但是查了下地址空间,DDR3 1G 而我将ltp-ddt和mtd-utils全部编进去,也才57MB,不应该放不下的。 Bad CRC...

java 符号引用与直接引用

简单来说: 符号引用就是字符串,这个字符串包含足够的信息,以供实际使用时可以找到相应的位置。你比如说某个方法的符号引用,如:“java/io/PrintStream.println:(Ljava/lang/String;)V”。里面有类的信息,方法名,方法参数等信息。当第一次运行时,要根据字符串的内容,到该类的方法表中搜索这个方法。运行一次之后,符号引用...

Spring配置JDBC连接Orcale、MySql、sqlserver

阅读指南:本文章主要讲述如何在Spring框架中配置JDBC连接方式连接Oracle、Mysql、SqlServer。 原理如下: 一、导包 连接oracle11g所需的jar包:ojdbc6.jar连接mysql5.1所需的jar包:mysql-connector-java-5.1.12-bin.jar连接sqlserver2008所需的jar包:sql...