AOP

发布时间 2023-12-16 16:46:26作者: 哆啦兔子

2023-12-16 16:42:56

1. AOP

1.1作用

保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能。

1.2注解声明切入点

 

 

①    使用execution指示器选择方法,方法表达式以 * 号开始,标识我们不关心方法的返回值类型。然后我们指定了全限定类名和方法名。对于方法参数列表,我们使用 .. 标识切点选择任意的方法,无论该方法的入参是什么

②    声明了切点,表明在该切面的切点是cn.edu.ctbu.datajpa01.webapi.StudentRestController这个接口中的所有方法。

1.3注解声明五种通知类型

 

l  Pointcut

  

使用execution指示器选择方法,方法表达式以 * 号开始,标识我们不关心方法的返回值类型。然后我们指定了全限定类名和方法名。对于方法参数列表,我们使用 .. 标识切点选择任意的方法,无论该方法的入参是什么

声明了切点,表明在该切面的切点是cn.edu.ctbu.datajpa01.webapi.StudentRestController这个接口中的所有方法。

l  Before Advice

 

   这个通知在匹配log()切入点表达式的方法执行前被调用,它简单地向控制台打印一条消息显示准备开始执行api。

l  After Advice

 

这个通知在匹配log()切入点表达式的方法执行后被调用,同样向控制台打印一条消息。

l  AfterReturning Advice

 

这个通知在匹配log()切入点表达式的方法成功返回后被调用,记录返回值到日志

l  Around

 

确保一个通知可以在方法执行之前和之后运行

这个通知包裹了被匹配的方法,记录了方法的执行时间,并打印了方法的全限定名和执行时间到日志中。

1.4 注解声明切点表达式

多个通知使用了相同的切点表达式,对于像这样频繁出现的相同的表达式,我们可以使用 @Pointcut注解声明切点表达式,然后使用表达式——Pointcut去重。

 

声明了一个切点表达式,该方法 log的内容并不重要,方法名也不重要,实际上它只是作为一个标识,供通知使用。

1.5 测试

①失败:

 

 

②成功:

 

 

2. 统一返回值

2.1作用

在springboot项目里我们希望接口返回的数据包含至少三个属性:

code:请求接口的返回码,成功或者异常等返回编码,例如定义请求成功。

message:请求接口的描述,也就是对返回编码的描述。

data:请求接口成功,返回的结果。

2.2    创建枚举

 

2.3    创建返回结果类R

在utils包下定义一个统一的返回格式类

 

2.4    测试

 

 

3. 统一异常处理

3.1自定义异常类

定义了一个名为 RException 的自定义异常类

 

l  接受一个错误代码和一个错误消息作为参数,并通过调用父类 RuntimeException 的构造函数来设置异常消息。

l  这样子在应用程序中抛出特定类型的异常,以便更容易捕获和处理。在捕获这个异常时,可以访问错误代码和消息,以便进行相应的处理。

3.2全局异常处理类

 

l  一个Exception类型的异常作为参数,用于处理捕获到的异常。使用RUtil.error方法创建一个通用错误响应对象R。错误代码为-999,错误消息为捕获到的异常的消息(通过e.getMessage()获取)

l  @RestControllerAdvice注解:用来开启全局的异常捕获

l  @ExceptionHandler注解:说明捕获哪些异常,对那些异常进行处理。在这个类中,用于处理Exception类型的异常。

3.3 业务逻辑

在studentService中加入业务逻辑,验证用户提供的用户名和密码是否正确。如果不正确,抛出异常,如果正确,可能需要添加相应的逻辑来处理验证成功的情况。

 

3.4 controller代码测试

 

测试结果:

①    正常

 

②    异常

 

4. 实验心得体会

这一次实验主要涉及了Spring框架中的几个关键概念和技术,包括Spring AOP(Aspect-Oriented Programming)和Spring MVC中的异常处理。

l  Spring AOP

通过@Aspect注解和切面表达式,我们可以使用Spring AOP来定义切面,实现在应用程序中的不同层次上横切关注点。通过@Before和@After注解的方法,我们可以在目标方法执行之前和之后执行额外的逻辑。在这次实验过程中使用的切面主要用于记录方法的执行时间和输出返回值,还可以用在异常处理,日志记录等。

l  通用响应对象和异常处理

通用响应对象R<T>的设计使得可以在应用程序中一致地封装响应。全局异常处理类则通过@RestControllerAdvice和@ExceptionHandler注解,提供了一种集中处理异常的机制。

l  业务逻辑验证

通过validateUserPassword方法,实现了简单的用户名和密码的验证逻辑,抛出异常来表示验证失败。

总体而言,这一节帮助我更深入地理解了Spring框架中AOP和异常处理的一些关键概念,以及如何处理捕获全局异常以及怎么自定义异常,顺便说明了统一结果的返回格式。而这些知识对于构建可维护和健壮的程序是非常有用的,让我对Spring的理解有了更深的认识和理解。