您的位置:首页 > 编程语言 > Java开发

源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)

nilaileme 2020-06-09 21:49 260 查看 https://www.cnblogs.com/xiaofu
![](https://img2020.cnblogs.com/blog/2030202/202006/2030202-20200609215006431-1003784316.jpg) 作者:小傅哥 博客:[https://bugstack.cn](https://bugstack.cn) - `汇总系列原创专题文章` >沉淀、分享、成长,让自己和他人都能有所收获!😄 ## 一、前言介绍 一个知识点的学习过程基本分为;运行helloworld、熟练使用api、源码分析、核心专家。在分析mybaits以及mybatis-spring源码之前,我也只是简单的使用,因为它好用。但是他是怎么做的多半是凭自己的经验去分析,但始终觉得这样的感觉缺少点什么,在几次夙兴夜寐,靡有朝矣之后决定彻底的研究一下,之后在去仿照着写一版核心功能。依次来补全自己的技术栈的空缺。在现在技术知识像爆炸一样迸发,而我们多半又忙于工作业务开发。就像一个不会修车的老司机,只能一脚油门,一脚刹车的奔波。车速很快,但经不起坏,累觉不爱。好!为了解决这样问题,也为了钱程似锦(形容钱多的想家里的棉布一样),努力! **开动之前先庆祝下我的iPhone4s又活了,还是那么好用(*嗯!有点卡*);** >![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91c2VyLWdvbGQtY2RuLnhpdHUuaW8vMjAyMC8xLzIwLzE2ZmMwZjliNTFjNWUzNGM?x-oss-process=image/format,png) ## 二、以往章节 关于mybaits & spring 源码分析以及demo功能的章节汇总,可以通过下列内容进行系统的学习,同时以下章节会有部分内容涉及到demo版本的mybaits; - [源码分析 | Mybatis接口没有实现类为什么可以执行增删改查](https://bugstack.cn/itstack-demo-any/2019/12/25/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-Mybatis%E6%8E%A5%E5%8F%A3%E6%B2%A1%E6%9C%89%E5%AE%9E%E7%8E%B0%E7%B1%BB%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8F%AF%E4%BB%A5%E6%89%A7%E8%A1%8C%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5.html) - [源码分析 | 像盗墓一样分析Spring是怎么初始化xml并注册bean的](https://bugstack.cn/itstack-demo-any/2020/01/08/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E5%83%8F%E7%9B%97%E5%A2%93%E4%B8%80%E6%A0%B7%E5%88%86%E6%9E%90Spring%E6%98%AF%E6%80%8E%E4%B9%88%E5%88%9D%E5%A7%8B%E5%8C%96xml%E5%B9%B6%E6%B3%A8%E5%86%8Cbean%E7%9A%84.html) - [源码分析 | 基于jdbc实现一个Demo版的Mybatis](https://bugstack.cn/itstack-demo-any/2020/01/13/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E5%9F%BA%E4%BA%8Ejdbc%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AADemo%E7%89%88%E7%9A%84Mybatis.html) ## 三、一碟小菜类代理 往往从最简单的内容才有抓手。先看一个接口到实现类的使用,在将这部分内容转换为代理类。 ### 1. 定义一个 IUserDao 接口并实现这个接口类 ```java public interface IUserDao { String queryUserInfo(); } public class UserDao implements IUserDao { @Override public String queryUserInfo() { return "实现类"; } } ``` ### 2. new() 方式实例化 ```java IUserDao userDao = new UserDao(); userDao.queryUserInfo(); ``` 这是最简单的也是最常用的使用方式,new 个对象。 ### 3. proxy 方式实例化 ```java ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Class[] classes = {IUserDao.class}; InvocationHandler handler = (proxy, method, args) -> "你被代理了 " + method.getName(); IUserDao userDao = (IUserDao) Proxy.newProxyInstance(classLoader, classes, handler); String res = userDao.queryUserInfo(); logger.info("测试结果:{}", res); ``` - Proxy.newProxyInstance 代理类实例化方式,对应传入类的参数即可 - ClassLoader,是这个类加载器,我们可以获取当前线程的类加载器 - InvocationHandler 是代理后实际操作方法执行的内容,在这里可以添加自己业务场景需要的逻辑,在这里我们只返回方法名 **测试结果:** ```java 23:20:18.841 [main] INFO org.itstack.demo.test.ApiTest - 测试结果:你被代理了 queryUserInfo Process finished with exit code 0 ``` ## 四、盛宴来自Bean工厂 在使用Spring的时候,我们会采用注册或配置文件的方式,将我们的类交给Spring管理。例如; ```java
标签: