Spring5学习(七):注解方式进行AOP操作 及 多种通知类型的测试

简介: 先来介绍一下AOP操作中的几个术语:1、连接点:指类里面可以被增强的方法2、切入点:指实际被增强的方法3、通知:指实际增强的逻辑部分4、切面:把通知应用到切入点的过程

先来介绍一下AOP操作中的几个术语:


1、连接点:指类里面可以被增强的方法

2、切入点:指实际被增强的方法

3、通知:指实际增强的逻辑部分

4、切面:把通知应用到切入点的过程


Spring框架一般都是基于AspectJ实现AOP操作


1、导入相关jar包:


20210813232421435.png


2、进行通知的配置:

     

创建bean1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--    开启注解扫描-->
    <context:component-scan base-package="AOPDemo"></context:component-scan>
<!--    开启Aspect生成代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>


3、创建被增强类User,增加注解@Componet

package AOPDemo;
import org.springframework.stereotype.Component;
/**
 * 用于 用注解方式进行AOP操作
 */
@Component
public class User {
    public void add(){
        System.out.println("hhh");
    }
}


4、创建增强类UserProxy

     

先增加注解@Componet,再在下方增加注解@Aspect

     

通知类型的注解:@加上注解类型(注解表达式)


例如:@Before(value = "execution(* AOPDemo.User.add(..))")

package AOPDemo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect     //表示生产代理对象
public class UserProxy {
    /**
     * 前置通知
     * 作为通知,在User类的add()之前调用
     */
    @Before(value = "execution(* AOPDemo.User.add(..))")
    public void before(){
        System.out.println("before....");
    }
    /**
     * 最终通知
     */
    @After(value = "execution(* AOPDemo.User.add(..))")
    public void after(){
        System.out.println("after....");
    }
    /**
     * 后置通知(返回通知)
     */
    @AfterReturning(value = "execution(* AOPDemo.User.add(..))")
    public void afterReturning(){
        System.out.println("afterReturning....");
    }
    /**
     * 异常通知
     */
    @AfterThrowing(value = "execution(* AOPDemo.User.add(..))")
    public void afterThrowing(){
        System.out.println("afterThrowing....");
    }
    /**
     * 环绕通知 ,会在被增强的方法前后都执行
     */
    @Around(value = "execution(* AOPDemo.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("around before....");
        //被增强的方法执行
        proceedingJoinPoint.proceed();
        System.out.println("around after....");
    }
}


在这里补充一下知识:通知有多种类型:

20210813232736710.png


在增强方法中,我把它们全部测试一遍,看看效果如何

也可以用切入点抽取把相同的切入点表达式抽取,可以简单一点

/**
 * 相同切入点抽取的做法
 */
@Component
@Aspect     //表示生产代理对象
class UserProxy1{
    //相同切入点抽取
    @Pointcut(value = "execution(* AOPDemo.User.add(..))")
    public void pointdemo(){
    }
    /**
     * 前置通知
     * 作为通知,在User类的add()之前调用
     */
    @Before(value = "pointdemo()")
    public void before(){
        System.out.println("before....");
    }
    /**
     * 最终通知
     */
    @After(value = "pointdemo()")
    public void after(){
        System.out.println("after....");
    }
    /**
     * 后置通知(返回通知)
     */
    @AfterReturning(value = "pointdemo()")
    public void afterReturning(){
        System.out.println("afterReturning....");
    }
    /**
     * 异常通知
     */
    @AfterThrowing(value = "pointdemo()")
    public void afterThrowing(){
        System.out.println("afterThrowing....");
    }
    /**
     * 环绕通知 ,会在被增强的方法前后都执行
     */
    @Around(value = "pointdemo()")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("around before....");
        //被增强的方法执行
        proceedingJoinPoint.proceed();
        System.out.println("around after....");
    }
}


5、写一个测试方法测试一下

@Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        User user = context.getBean("user",User.class);
        user.add();
    }


测试结果:


20210813234050890.png


可以看到,异常通知并没有出现,是因为代码中没有异常,那我们手动添加一下异常,看看效果

在add方法中加个异常10/0

20210813234252166.png

运行一下:

20210813234327192.png


可以看出,除了异常通知之外,还有after(后置)通知也执行了。

以上就是使用注解方式进行AOP操作的过程了,比XML文件配置的方式要简单一些。

相关文章
|
29天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
12天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
40 5
|
17天前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
47 8
|
17天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
17天前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
32 5
|
17天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
26 4
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0
|
28天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
55 3
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
71 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
256 7
Jmeter实现WebSocket协议的接口测试方法