首页
搜索 搜索
当前位置:关注 > 正文

模拟mybatis接口动态注册过程|天天微速讯

2023-04-04 16:59:03 博客园

思考

前文提到2种方式动态加载bean到容器,这里我们模拟一下mybatis手动注册Bean到容器的过程。模拟有啥好处,主要是为了方便你理解如何手动注册Bean的过程及mybatis的设计思想。毕竟这个才是spring的核心内容。

首先思考一下问题


(相关资料图)

如果你实现这个问题,你准备怎么实现???

个人感觉核心点就只有3个

1,如何将接口的具体的内容实现,毕竟我们只有接口+XML内容,木有具体的实现

2,如何将实现加入IOC容器中

3,需要一个入口加载上述步骤

需要实现考虑的点

1,如何屏蔽复杂Bean创建过程

为啥会抛出这个问题,主要是为了引出FactoryBean存在的意义,spring构建Bean实例是通过反射来如:class.forName("全路径名"),但是如果这个时候,bean的实例化需要依赖各种外部(构造方法参数比较多,这些参数的来源比较杂,参数来源于本地环境,XML,数据库等等,和平时无参构造不同)这个时候就没法通过直接反射来完成啦。

这个时候可以考虑实现FactoryBean接口(实际业务中,基本上很少使用,但是源码中大量使用,只需要记住复杂的Bean的实例化过程可以考虑FactoryBean即可)

public class C implements FactoryBean {    public C(String parameter1,String parameter2){        this.parameter1 = parameter1;        this.parameter2 = parameter2;    }    private String parameter1;    private String parameter2;    @Override    public Object getObject() throws Exception {        /**         *    parameter1,parameter2 依赖外部数据,         *    可以在这里初始化         *   考虑在这个地方写Bean的初始化         */        return new C("111","222");    }    @Override    public Class getObjectType() {        return null;    }}

2,spring如何知道要扫描那些类,并且自动要加到容器中

肯定是通过某个注解标记要扫描那些类,这个肯定就是一切的开始 ,如:

@MapperScan(basePackages = "*****")

3,mybatis只有接口,木有实现,这个问题怎么处理

毫不犹豫这个是通过代理来实现的。这个不能随便乱用(适用场景有限)mybatis之所以能用的根本原因,所有的接口的具体实现,最后就是4个实现"增删改查"。

4,spring如何裁剪bean的定义(比如添加,删除,修改IOC容器中的Bean)

其实讨论这个意义不是很大,抛却技术的实现的必要性,完全可以避免Bean的裁剪(比如:我们一定是先定义好BeanDefinition,在加入容器,没必要加入容器后在取出来进行裁剪),这个东西只是让你多一个思路。

要支持Bean的裁剪实现BeanDefinitionRegistryPostProcessor接口即可

实现DEMO

模拟mybatis向IOC容器注册过程基本思路

实现基本思路

技术阅读路线

源码位置:https://gitee.com/WuWuYaoWang/shardingsphere-demo-5.2.0