模拟mybatis接口动态注册过程

思考

    前文提到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

posted on 2023-04-04 17:10  柠檬糖大人你尽然盗号  阅读(36)  评论(0编辑  收藏  举报

导航