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

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: # 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日志并进行多维度分析。
相关文章
|
18天前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
3月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
276 26
|
4月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
221 6
|
4月前
|
缓存 Java 数据库
SpringBoot缓存注解使用
Spring Boot 提供了一套方便的缓存注解,用于简化缓存管理。通过 `@Cacheable`、`@CachePut`、`@CacheEvict` 和 `@Caching` 等注解,开发者可以轻松地实现方法级别的缓存操作,从而提升应用的性能和响应速度。合理使用这些注解可以大大减少数据库的访问频率,优化系统性能。
249 89
|
2月前
|
JSON 前端开发 Java
Spring MVC常用的注解
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中 的所有响应请求的方法都是以该地址作为父路径。 @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。 @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。 @Controller:控制器的注解,表示是表现层,不能用用别的注解代替 @RestController : 组合注解 @Conntroller + @ResponseBody @GetMapping , @PostMapping , @Put
|
2月前
|
Java Spring
Spring Boot的核心注解是哪个?他由哪几个注解组成的?
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : ● @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能; ● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项 ● @ComponentScan:Spring组件扫描
|
2月前
|
Java 测试技术 Spring
SpringBoot+@Async注解一起用,速度提升
本文介绍了异步调用在高并发Web应用性能优化中的重要性,对比了同步与异步调用的区别。同步调用按顺序执行,每一步需等待上一步完成;而异步调用无需等待,可提升效率。通过Spring Boot示例,使用@Async注解实现异步任务,并借助Future对象处理异步回调,有效减少程序运行时间。
|
1月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
3月前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
104 16
|
3月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
194 25