6.1 使用注解开发
注解这东西,我们都知道 在某个点 加个注解,然后可以传递相关参数,也可以代表 某些含义。我们还能够 动态的获取 它。所以注解 用的好的话,是可以实现 很多 事情的。而 现在的 大多数 框架 都是 大量注解存在的,所以 我们要知道 如何要了解下 如何注解开发。
虽然 mybatis 几乎 用不到注解,大多数都在配置文件里,剩下的 也都是几行代码 解决的。但 我们现在 就学了 这么一个框架,所以 也只能从 这里开始了解 注解开发。
6.1.1 面向接口编程
-
大家之前都学过面向对象编程,也学习过接口但在真正的开发中,很多时候我们会选择面向接口编程。
-
根本原因:解耦,可扩展,提高复用,分层开发中,上层不用具体实现,大家都遵守共同的标准,使得开发变得容易,规范性更好。
-
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的,在这种情况下,各种对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了。
-
而各个对象之间的 协作关系则 成为系统设计的关键,小到不同类之间的通信,大到各模块之间的交互,在系统设计的之处都是要着重考虑的,这也是系统设计的主要工作内容,面向对象接口编程就是指按照这种思想来编程。
关于接口的理解
- 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
- 接口本身反映了系统设计人员对系统的抽象理解。
- 接口应有两类:
第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class)
第二类是对一个个体某一方面的抽象,即形成一个抽象面 - 一个体 有可能有 多个抽象面。抽象体与抽象面是有区别的。
三个面向的区别
- 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法。
- 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,主要考虑它的实现。
- 接口设计与非接口设计时针对复用技术而言的,与面向对象(过程)不是 一个问题,它更多的体现在 对 系统整体架构的 设计。
而用注解开发,是能够更加符合 面向接口 开发思想的!
6.2.1 mybatis 的注解开发
package org.mybatis.example;
public interface BlogMapper {
@select ("select * from blog where id = #{id}")
Blog selectBlog(int id);
}
没错,我们 完全可以用 mybatis 框架里面 提供的自定义注解 来实现很多 事情。比如 在这里 @select 就是 帮我们 在配置文件里 配置 注解的这个方法 的 select 查询语句,sql 语句 就是我们 提供的 string 参数。
但实际上,我们 使用 mybatis 是不建议 使用 这种 sql 注解的,因为 在很多情况下,xml 能够做更多的 配置,而 sql 注解 只能 配置一个 sql语句的标签。这就会导致 出现很多 问题。并且 当 方法多了之后,放到 xml 里面,比 在 这里 用注解 更加好维护。
6.3 mybatis 的一些实现原理
其实很多框架的 底层实现原理,都是 注解和反射。当然 最初的想法 都是 要 读取 到关键信息,以求更好的 实现 使用框架的开发者的需求!
6.3.1 读取配置文件
我们配置的 XML 文件,其实 都可以 通过 IO 流读取过来,这个点 其实从 我们 通过 mybais-config.xml
的 输入流 为参数 创建 sqlSessionFactory 那里 就已经 可以看出来了。
我们之所以 可以通过 xml 配置文件 来 进行 相关的功能配置。是因为 我们写在 配置文件里面的 信息都可以 被 IO 流 读取出来!
读取出来后,我们 提取 关键的信息,把这些信息 都赋值 给 sqlSession 这个 对象的 属性上。再 通过 sqlSession 就可以知道 我们配置的 所有信息了。
我们 还会发现 sqlSession 里面 有一个 executor 执行者,我们大可怀疑 这是 执行 sql 语句的对象。
6.3.2 通过反射读取注解和相关class 的信息
在 获取 mapper 对象的时候,我们是 通过 一个方法, getMapper()
进行 获取的,而 提供的参数,就是我们 设定的 接口 UserMapper
的反射,即 UserMapper.class
这就意味着,我们可以拿到 UserMapper 类模板 几乎 所有的信息。包括注解!!!
因为 我们 的 mapper 最后类型是 接口 的类型,所以可以调用 这个接口的方法。那么 在调用的时候,是不是 我们就可以 对 这个方法 进行分析,因为 我们已经拿到了 UserMapper.class
,分析的时候,就可以 获取它的注解,获取 到 该方法的 返回类型,等等一系列的关键信息。
比如 我们这里 就使用了,注解,所以 我们可以 解读这个注解,然后 用 sqlSession 里面的执行者 去执行 sql。最后 返回 userList。
这就是 Mybatis 的一些 基本 原理。还是需要 大家掌握的!
- 本质:反射机制实现
- 核心的技术:动态代理
动态代理和静态代理的区别:静态代理 是 写死的,而 动态代理 是动态的,真就这么简单。没有想象的那么难。。就是 静态代理 无论是代理对象还是目标对象 还是处理的代码,都是写死的。改变了 也还是那样。但是动态代理 就都是 动态的,改变之后,肯定会 变。而且 也可以 接收任意的 目标对象 和 代理对象。