模拟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