Spring5深入浅出篇:AOP底层实现原理

本文涉及的产品
云原生网关 MSE Higress,422元/月
MSE Nacos 企业版免费试用,1600元额度,限量50份
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 该文档介绍了Spring AOP的底层实现原理,核心问题包括动态代理类的创建。JDK动态代理通过`Proxy.newProxyInstance()`创建接口的实现类,而CGlib则是通过子类继承父类的方式生成代理对象。文中还提供了JDK和CGlib动态代理的代码示例。最后总结,JDK代理基于接口,CGlib则基于继承父类来实现。

Spring5深入浅出篇:AOP底层实现原理

核⼼问题

1. AOP如何创建动态代理类(动态字节码技术)
2. Spring⼯⼚如何加⼯创建代理对象
 通过原始对象的id值,获得的是代理对象

动态代理类的创建

JDK的动态代理

  • Proxy.newProxyInstance⽅法参数详解


  • 编码
public class TestJDKProxy {
 /*
 1. 借⽤类加载器 TestJDKProxy
 UserServiceImpl
 2. JDK8.x前
 final UserService userService = new UserServiceImpl();
 */
 public static void main(String[] args) {
 //1 创建原始对象
 UserService userService = new UserServiceImpl();
 //2 JDK创建动态代理
 InvocationHandler handler = new InvocationHandler(){
 @Override
 public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
 System.out.println("------proxy log --------");
 //原始⽅法运⾏
 Object ret = method.invoke(userService, args);
 return ret;
 }
 };
 UserService userServiceProxy =(UserService)Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(),userService.getClass().getInterfaces(),handler);
 userServiceProxy.login("suns", "123456");
 userServiceProxy.register(new User());
 }
}

CGlib的动态代理

CGlib创建动态代理的原理:⽗⼦继承关系创建代理对象,原始类作为⽗类,代理类作为⼦类,这样既可以保证2者⽅法⼀致,同时在代理类中提供新的实现(额外功能+原始⽅法)

  • CGlib编码
package com.baizhiedu.cglib;
import com.baizhiedu.proxy.User;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class TestCglib {
 public static void main(String[] args) {
 //1 创建原始对象
 UserService userService = new UserService();
 /*
 2 通过cglib⽅式创建动态代理对象
 
Proxy.newProxyInstance(classloader,interface,invocationhandler)
 Enhancer.setClassLoader()
 Enhancer.setSuperClass()
 Enhancer.setCallback(); ---> MethodInterceptor(cglib)
 Enhancer.create() ---> 代理
 */
 Enhancer enhancer = new Enhancer();
 enhancer.setClassLoader(TestCglib.class.getClassLoader());
 enhancer.setSuperclass(userService.getClass());
 MethodInterceptor interceptor = new MethodInterceptor() {
 //等同于 InvocationHandler --- invoke
 @Override
 public Object intercept(Object o, Method method,Object[] args, MethodProxy methodProxy) throws Throwable {
  System.out.println("---cglib log----");
  Object ret = method.invoke(userService, args);
  return ret;
  }
 };
  enhancer.setCallback(interceptor);
  UserService userServiceProxy = (UserService)
  enhancer.create();
  userServiceProxy.login("suns", "123345");
  userServiceProxy.register(new User());
 }
}


总结


JDK动态代理 Proxy.newProxyInstance() 通过接⼝创建代理的实现类


Cglib动态代理 Enhancer 通过继承⽗类创建的代理类


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

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

相关文章
|
2月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
6月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
268 6
|
5月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
256 25
|
5月前
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
147 24
|
4月前
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
197 0
|
4月前
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
95 0
|
6月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
321 8
|
8月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
233 2
Spring Aop该如何使用
|
8月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
208 5
|
8月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
281 8