📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜
✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————
目录
Mybatis源码中使⽤了⼤量的设计模 式,观察设计模式在其中的应⽤,能够更深⼊的理解设计模式,我一直认为根据实际的代码来学习设计模式才能更有效的掌握设计模式。光看一些书本上的东西和demo项目虽然能够知道设计模式,但是这样学来的东西记得不深,容易遗忘。
这里带着大家通过mybatis来学习设计模式,通过大神们的代码来学习,站在巨人的肩膀上,我们肯定能过事半功倍。今天的设计模式是 构建者模式,想学习其他社交模式,欢迎关注我。
在mybaits中使用构造者模式的地方很多,例如SqlSessionFactoryBuilder、Environment等
⛳️ 1.什么是构建者模式
Builder模式的定义是"将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表 示。”,它属于创建类模式,⼀般来说,如果⼀个对象的构建⽐较复杂,超出了构造函数所能包含的范 围,就可以使⽤⼯⼚模式和Builder模式,相对于⼯⼚模式会产出⼀个完整的产品,Builder应⽤于更加 复杂的对象的构建,甚⾄只会构建产品的⼀个部分,直⽩来说,就是使⽤多个简单的对象⼀步⼀步构建 成⼀个复杂的对象。
主要思想就是化繁为简。
🌰举个例子🌰
使⽤构建者设计模式来⽣产computer,由于计算机是一个很复杂的对象,由很多部分组成,那么我们怎么通过构建者设计模式创建生产应该computer呢???
主要步骤:
- 将需要构建的⽬标类分成多个部件(电脑可以分为主机、显示器、键盘、⾳箱等部件);
- 创建构建类;
- 依次创建部件;
- 将部件组装成⽬标对象
定义computer
public class Computer {
private String displayer;
private String mainUnit;
private String mouse;
private String keyboard;
...getset方法省略
toString方法省略
}
public class ComputerBuilder {
private Computer computer=new Computer();
public void installDisplayer(String displayer) {
computer.setDisplayer(displayer);
}
public void installMainUnit(String mainUnit) {
computer.setMainUnit(mainUnit);
}
public void installMouse(String displayer) {
computer.setMouse(displayer);
}
public void installKeybord(String keybord) {
computer.setKeyboard(keybord);
}
public Computer getComputer(){
return computer;
}
}
测试:
public class ConstructorTest {
public static void main(String[] args) {
ComputerBuilder computerBuilder = new ComputerBuilder();
computerBuilder.installDisplayer("显示器");
computerBuilder.installKeybord("键盘");
computerBuilder.installMainUnit("主机");
computerBuilder.installMouse("鼠标");
Computer computer = computerBuilder.getComputer();
System.out.println(computer);
}
}
上面就是通过构建者模式将一个复杂的电脑构建出来了,将复杂对象拆分成四个简单的对象,构建出电脑来了。
⛳️ 2.Mybatis中使用的构造者模式
下面说一下Mybatis中使用的构造者模式:
SqlSessionFactory 的构建过程:
Mybatis的初始化⼯作⾮常复杂,不是只⽤⼀个构造函数就能搞定的。所以使⽤了建造者模式,使⽤了 ⼤ 量的Builder,进⾏分层构造,核⼼对象Configuration使⽤了 XmlConfigBuilder来进⾏构造
在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调⽤XMLConfigBuilder读取所有的 MybatisMapConfig.xml 和所有的 *Mapper.xml ⽂件,构建 Mybatis 运⾏的核⼼对象 Configuration 对 象,然后将该Configuration对象作为参数构建⼀个SqlSessionFactory对象。
//解析配置
private void parseConfiguration(XNode root) {
try {
//分步骤解析
//issue #117 read properties first
//1.properties
propertiesElement(root.evalNode("properties"));
//2.类型别名
typeAliasesElement(root.evalNode("typeAliases"));
//3.插件
pluginElement(root.evalNode("plugins"));
//4.对象工厂
objectFactoryElement(root.evalNode("objectFactory"));
//5.对象包装工厂
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
//6.设置
settingsElement(root.evalNode("settings"));
// read it after objectFactory and objectWrapperFactory issue #631
//7.环境
environmentsElement(root.evalNode("environments"));
//8.databaseIdProvider
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
//9.类型处理器
typeHandlerElement(root.evalNode("typeHandlers"));
//10.映射器
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
上面的复杂对象就是Configuration对象,为了构建这个复杂对象这里就使用了构造者模式,将复杂对象分成很多小的对象(也就是每一个标签)。
其中 XMLConfigBuilder 在构建 Configuration 对象时,也会调⽤ XMLMapperBuilder ⽤于读取 *Mapper ⽂件,⽽XMLMapperBuilder会使⽤XMLStatementBuilder来读取和build所有的SQL语句。
在这个过程中,有⼀个相似的特点,就是这些Builder会读取⽂件或者配置,然后做⼤量的XpathParser 解析、配置或语法的解析、反射⽣成对象、存⼊结果缓存等步骤,这么多的⼯作都不是⼀个构造函数所 能包括的,因此⼤量采⽤了 Builder模式来解决。
SqlSessionFactoryBuilder类根据不同的输⼊参数来构建SqlSessionFactory这个⼯⼚对象
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。创作不易,请动一下您发财的小手,为我点个小👍