目录
-
前言
-
参考目录
-
学习笔记
-
1、Java 注解
-
1.1、Java 元注解
-
1.2、Java ElementType 枚举值
-
1.3、自定义注解
-
2、`@Param` 注解分析
-
2.1、`@Param` 注解
-
2.2、测试方法
-
2.3、流程分析(重点:`ParamNameResolver`)
前言
本文内容对应的是书本第 7 章的内容,主要是关于Java 元注解以及 @Param
注解的分析。
参考目录
-
《通用源码阅读指导书:MyBatis源码详解》
本文主要内容来自 第7章 annotations包与lang包
。
-
《通用源码阅读指导书——MyBatis源码详解》配套示例
书中涉及的 Demo 示例,本文示例在 Demo1
的基础上进行了简单改造。
与上篇一样,需要说明的是,书中使用的框架版本和本文(本专栏)使用的版本不一样。
名称 | 书中版本 | 专栏版本 |
---|---|---|
MyBatis | 3.5.2 | 3.5.11+ |
Spring Boot | 2.X | 3.X |
JDK | 8 | 17+ |
随着版本的升级迭代,会有一些内容不尽相同,需要结合着进行学习。
学习笔记
1、Java 注解
1.1、Java 元注解
两处划红色虚线的位置是我做了想法标注,由于作者使用的 JDK 版本并不是最新的,因此和现在的有差异,下面来说明一下。
Java中一共有 七个 元注解,分别是@Documented
、@Target
、@Retention
、@Inherited
、@Repeatable
、@Native
、@ContentType
。
-
@Native
:这个注解用于标记一个方法是本地方法(native method)。本地方法是由非 Java 代码实现的方法,通常是用 C 或 C++ 等语言编写的。使用本地方法可以实现与Java虚拟机之外的底层系统或资源的交互。在声明本地方法时需要使用该注解,同时还需要在本地方法中使用 JNI(Java Native Interface)来和非 Java 代码交互。 -
@ContentType
:用于指定注解所表示的内容类型,例如时间跨度或频率。


1.2、Java ElementType 枚举值
在 JDK 17 中,又多了两种枚举值 MODULE
以及 RECORD_COMPONENT
。

1.3、自定义注解
关于自定义注解,书中有进行举例说明。
结合前面学习的内容,本文以前几篇文章中分析 RuoYi-Vue-Plus
框架中的自定义注解 @Translation
为例对元注解的使用进行简单说明:
2、@Param
注解分析
完成了对 Java 注解的基本了解之后,书中对 MyBatis 自定义注解 @Param
注解进行了分析,并结合代码分析了关于 Mapper 接口中定义的参数进行解析的过程。
2.1、@Param
注解

2.2、测试方法
参照书中的举例,结合 Demo1
进行了一些改造,其他不变,重点是观察 Mapper 接口的参数解析过程。

2.3、流程分析(重点:ParamNameResolver
)

此方法是最终执行 SQL 查询的主要方法。参数的解析方法在第一步 cachedInvoker(method)
时完成。
创建映射方法,创建 SQL 命令以及方法签名 MethodSignature
。
MethodSignature#MethodSignature
该方法的最后会创建一个参数名称解析器 ParamNameResolver
,也是@Param
注解能够生效的原因所在。
ParamNameResolver#ParamNameResolver
由于测试方法中第二个参数没有标注注解,来看下它的参数名实际上是什么:

本章节的重点是分析参数名称解析器 ParamNameResolver
的执行过程,对于其他方法会在后续的章节中再展开说明。
(完)
原文始发于微信公众号(狮子领域 程序圈):【MyBatis】源码学习 02 – Java 元注解以及 MyBatis @Param 注解分析
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/215037.html