Spring5深入浅出篇:基于注解实现的AOP

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
注册配置 MSE Nacos/ZooKeeper,118元/月
函数计算FC,每月15万CU 3个月
简介: # Spring5 AOP 深入理解:注解实现本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib

Spring5深入浅出篇:基于注解实现的AOP

基于注解的AOP编程的开发步骤

  1. 原始对象
  2. 额外功能
  3. 切⼊点
  4. 组装切⾯

可以发现其实1,2,3最终目的就是为了去组装切面,其实这里和我们传统开发aop的步骤是一样的

# 通过切⾯类 定义了 额外功能 @Around
 定义了 切⼊点 @Around("execution(* login(..))")
 @Aspect 切⾯类
 
package com.baizhiedu.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
/*
传统使用配置文件开发aop步骤
 1. 额外功能
 public class MyArround implements MethodInterceptor{
 public Object invoke(MethodInvocation invocation){
     Object ret = invocation.proceed();
     return ret;
  }
 }
 2. 切⼊点
 <aop:config
 <aop:pointcut id="" expression="execution(*login(..))"/>
 */
@Aspect
public class MyAspect {
 //这里通过注解的方式定义切入点表达式
 @Around("execution(* login(..))")
 public Object arround(ProceedingJoinPoint joinPoint) throws
Throwable {
  //增强额外方法,这里还是通过日志的形式表现
 System.out.println("----aspect log ------");
 //这里不再通过MethodInvocation的方式来代表原始方法执行,而是ProceedingJoinPoint
 Object ret = joinPoint.proceed();
 return ret;
 }
}
<bean id="userService"
class="com.baizhiedu.aspect.UserServiceImpl"/>
 <!--
 切⾯
 1. 额外功能
 2. 切⼊点
 3. 组装切⾯
 -->
<bean id="arround" class="com.baizhiedu.aspect.MyAspect"/>
<!--告知Spring基于注解进⾏AOP编程-->
<aop:aspectj-autoproxy />

细节

切⼊点复⽤

首先第一个问题,为什么需要切入点复用呢?主要是为了在同一个切入点增加一个额外方法,比如我们给切入点添加了日志方法还需要添加事务相关方法时,就需要重复编码导致代码可维护性差

首先看如下代码

@Aspect
public class MyAspect {
 //这里通过注解的方式定义切入点表达式
 @Around("execution(* login(..))")
 public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
  //增强额外方法,这里还是通过日志的形式表现
  System.out.println("----aspect log ------");
 //这里不再通过MethodInvocation的方式来代表原始方法执行,而是ProceedingJoinPoint
   Object ret = joinPoint.proceed();
  return ret;
 }
    
    //可以明显发现这里写了重复的代码,如果我们需要将login方法替换成register方法将会需要修改每一个
     @Around("execution(* login(..))")
 public Object arround1(ProceedingJoinPoint joinPoint) throws Throwable {
  //增强额外方法,这里还是通过日志的形式表现
  System.out.println("----事务相关操作 ------");
 //这里不再通过MethodInvocation的方式来代表原始方法执行,而是ProceedingJoinPoint
   Object ret = joinPoint.proceed();
  return ret;
 }  
}

通过切入点注解 @Pointcut 进行优化

切⼊点复⽤:在切⾯类中定义⼀个函数 上⾯@Pointcut注解 通过这种⽅式,定义切
⼊点表达式,后续更加有利于切⼊点复⽤。
@Aspect
public class MyAspect {
    
 @Pointcut("execution(* login(..))")
 public void myPointcut(){}
    
 @Around(value="myPointcut()")
 public Object arround(ProceedingJoinPoint joinPoint) throws Throwable {
     System.out.println("----aspect log ------");
     Object ret = joinPoint.proceed();
     return ret;
 }
    
 @Around(value="myPointcut()")
 public Object arround1(ProceedingJoinPoint joinPoint) throws Throwable {
     System.out.println("----aspect tx ------");
     Object ret = joinPoint.proceed();
     return ret;
 }
}

动态代理的创建⽅式

AOP底层实现 2种代理创建⽅式
1. JDK 通过实现接⼝ 做新的实现类⽅式 创建代理对象
2. Cglib通过继承⽗类 做新的⼦类 创建代理对象
默认情况 AOP编程 底层应⽤JDK动态代理创建⽅式
如果切换Cglib
 1. 基于注解AOP开发
 <aop:aspectj-autoproxy proxy-target-class="true" />
 2. 传统的AOP开发
 <aop:config proxy-target-class="true">
 </aop>

AOP阶段知识总结


以上便是本文的全部内容,我是全干程序员demo,每天为你带来最新好用的开发运维工具,如果你觉得用,请点赞,让更多的人了解相关工具

如果你想了解更多关于全干程序员demo,还有更多付费工具免费破解,可以关注公众号-全干程序员demo,后面文章会首先同步至公众号

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4天前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
|
24天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
165 73
|
19天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
49 21
|
12天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
53 8
|
24天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
24天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
96 5
|
2月前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
55 4
|
2月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
178 2