苍穹外卖Day03中不懂的地方记录——SpringBoot补天笔记

2024-03-28 03:20

本文主要是介绍苍穹外卖Day03中不懂的地方记录——SpringBoot补天笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、公共字段填充功能

1. 自定义切面 AutoFillAspect 的 autoFill 方法

// 获取到当前被拦截方法上的数据库操作类型MethodSignature signature = (MethodSignature)joinPoint.getSignature(); // 方法签名对象AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);  // 获得方法上的注解对象OperationType operationType = autoFill.value(); // 获得数据库操作类型

这段代码是使用 Spring AOP(面向切面编程)来获取方法签名及方法上的注解信息。

  • joinPoint.getSignature():这是 Spring AOP 中的一个方法,用于获取连接点(Join Point)的签名信息,即被代理方法的相关信息,比如方法名、参数等。返回的类型是 Signature 类型的对象。

什么是连接点的签名信息?为什么要获取连接点的签名信息?

  • 连接点(Join Point)是在程序执行过程中可以插入切面的点。连接点的签名信息指的是连接点所代表的方法的相关信息,例如方法名、参数列表、返回类型等。
  • 获取连接点的签名信息在面向切面编程(AOP)中非常重要,因为切面通常需要根据被代理方法的具体信息来决定何时执行特定的逻辑。例如,一个切面可能只对特定的方法或特定的参数进行处理,而不对所有的方法都生效。
  • 在上面的代码中,获取连接点的签名信息是为了在切面中判断被代理方法上是否存在特定的注解,以及获取该注解中定义的属性值。这样可以根据方法上的注解信息来确定在何种情况下应用切面的逻辑。
  • getMethod().getAnnotation(AutoFill.class):这一步是获取方法上的注解对象。代码试图获取被代理方法上是否存在 AutoFill 注解。如果存在,则返回该注解的实例;如果不存在,则返回 null。

  • autoFill.value():这一步是获取注解实例中的 value 字段值,即获取数据库操作类型。

总之,可以先通过joinPoint.getSignature()获得连接点处的方法签名对象,再通过signature.getMethod().getAnnotation(AutoFill.class)获得代理方法上的AutoFill注解的实例,最后通过.value()方法获取注解的value,也就是数据库的操作类型

// 根绝当前不同的操作类型,为属性进通过反射来进行赋值if(operationType==OperationType.INSERT){try {// 插入字段,需要为4个公共字段赋值Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);// 通过反射为对象属性赋值setCreateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}

首先,根据给定的数据库操作类型(operationType)如插入、更新等。

在插入操作中,通常会对一些公共字段进行赋值,比如创建时间、创建用户、更新时间、更新用户等。通过反射invoke)获取实体类(entity)中对应的方法,这些方法通常用于设置这些公共字段的值。比如,setCreateTime 方法用于设置创建时间,setCreateUser 方法用于设置创建用户,以此类推。

接下来,通过反射调用这些方法,并传入相应的参数,即当前的时间(now)和当前用户的ID(currentId),来为实体类的属性赋值。

代码中的entity.getClass().getDeclaredMethod()有什么功能?
entity.getClass().getDeclaredMethod() 是 Java 反射机制中的一种方法,它用于获取类中声明的特定方法.

  • entity.getClass():获取对象 entity 所属的类对象。
  • getDeclaredMethod(String name, Class<?>… parameterTypes):根据方法名和参数类型获取类中的特定方法对象。其中,name 参数是方法的名称,parameterTypes 是一个可变参数,用于指定方法的参数类型。
    这个方法返回的是一个 Method 对象,它代表了类中具体的方法,通过这个对象可以调用对应的方法。在示例代码中,getDeclaredMethod() 方法用于获取实体类中的特定方法,例如用于设置创建时间、创建用户、更新时间和更新用户的方法。获取到这些方法后,可以通过反射机制来动态地调用它们,从而实现对实体对象属性的赋值。

什么是反射机制?
反射机制是 Java 编程语言中的一种特性,它允许程序在运行时检查、获取和修改其内部结构,包括类、接口、字段和方法等。通过反射,程序可以在运行时获取类的信息、调用类的方法、访问和修改类的属性,而不需要在编译时就知道这些信息。
反射机制提供了以下几个核心的功能:

  • 获取类的信息:通过反射可以获取类的名称、父类、实现的接口、构造方法、成员变量和方法等信息。
  • 创建对象实例:通过反射可以在运行时动态地创建类的对象实例。
  • 调用方法:可以在运行时动态地调用对象的方法,包括公有方法、私有方法、静态方法等。
  • 访问和修改属性:可以在运行时动态地访问和修改对象的属性,包括公有属性、私有属性等。
  • 动态代理:通过反射可以实现动态代理,生成代理对象并在运行时拦截对目标对象方法的调用。

这篇关于苍穹外卖Day03中不懂的地方记录——SpringBoot补天笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854294

相关文章

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关