当前位置: 首页 > news >正文

杭州百度整站优化服务建设网站过水

杭州百度整站优化服务,建设网站过水,wordpress博客模板安装失败,移动app开发外包公司【面试精讲】MyBatis设计模式及源码分析#xff0c;MyBatis设计模式实现原理 目录 本文导读 一、MyBatis中运用的设计模式详解 1. 工厂模式#xff08;Factory Pattern#xff09; 2. 单例模式#xff08;Singleton Pattern#xff09; 3. 建造者模式#xff08;Bu…【面试精讲】MyBatis设计模式及源码分析MyBatis设计模式实现原理 目录 本文导读 一、MyBatis中运用的设计模式详解 1. 工厂模式Factory Pattern 2. 单例模式Singleton Pattern 3. 建造者模式Builder Pattern 4. 代理模式Proxy Pattern 5. 模板方法模式Template Method Pattern 6. 策略模式Strategy Pattern 7. 观察者模式Observer Pattern 二、MyBatis设计模式的源码实现原理 工厂模式的应用 - SqlSessionFactory 单例模式的应用 - SqlSessionFactory 代理模式的应用 - Mapper动态代理 建造者模式Builder Pattern 策略模式 - Strategy Pattern 观察者模式 - Observer Pattern 三、MyBatis源码解析 工厂模式 - SqlSessionFactoryBuilder 单例模式 - SqlSessionFactory 代理模式 - MapperProxyFactory 总结 博主vXiaoMing_Java 本文导读 MyBatis是一个流行的持久层框架它极大地简化了数据库操作提升了开发效率。在其底层实现中MyBatis广泛采用了各种设计模式这些设计模式不仅增加了框架的灵活性和可维护性也为开发人员提供了丰富的使用场景和扩展能力。本文将深入探讨MyBatis所应用的主要设计模式及其在框架中的具体应用。 一、MyBatis中运用的设计模式详解 1. 工厂模式Factory Pattern 工厂模式是一种创建型模式它提供了一种创建对象的最佳方式。在MyBatis中SqlSessionFactoryBuilder、SqlSessionFactory等关键组件的创建过程就运用到了工厂模式。尤其是SqlSessionFactory的创建它是通过SqlSessionFactoryBuilder读取MyBatis配置文件并构建出SqlSessionFactory实例。这样做可以隔离复杂的初始化过程使用户只需关注最终产出而无需了解创建实例的复杂过程。 2. 单例模式Singleton Pattern 单例模式确保一个类只有一个实例并提供一个全局访问点。在MyBatis中SqlSessionFactory的设计就是单例模式的经典应用。一旦通过SqlSessionFactoryBuilder创建了SqlSessionFactory实例后该实例就会在应用程序中被复用避免了重复创建实例带来的资源浪费。 3. 建造者模式Builder Pattern 建造者模式旨在将一个复杂对象的构建与其表示分离使得同样的构建过程可以创建不同的表示。MyBatis中的XMLConfigBuilder、XMLMapperBuilder等类的设计采用了建造者模式。这些Builder类负责解析MyBatis的配置文件和映射文件逐步构建出配置信息和映射信息。通过建造者模式MyBatis将复杂的解析过程分解成一系列的步骤使得代码更加清晰和易于维护。 4. 代理模式Proxy Pattern 代理模式为其他对象提供一个代理以控制对这个对象的访问。MyBatis中对Mapper接口的实现就是基于JDK动态代理机制。当调用Mapper接口的方法时实际上是由MyBatis生成的代理类去执行。这种方式允许MyBatis在执行Mapper方法前后插入自定义逻辑如开启事务、处理缓存等从而大幅提升了灵活性和可扩展性。 5. 模板方法模式Template Method Pattern 模板方法模式定义了一个操作中的算法的骨架而将一些步骤延迟到子类中。MyBatis的BaseExecutor类就是一个模板方法模式的例证。它定义了数据库操作的基本流程如查询、更新、提交事务等而具体的执行逻辑则留给其子类比如SimpleExecutor、BatchExecutor等去实现。这样做的好处是复用了代码同时又保留了灵活性。 6. 策略模式Strategy Pattern 策略模式定义了一系列的算法并将每一个算法封装起来使它们可以相互替换。MyBatis中的缓存策略、加载策略等正是策略模式的应用。例如MyBatis允许用户配置不同的缓存实现如EHCache、OSCache等并在运行时根据配置动态选择。这种模式使得MyBatis具有很高的灵活性和扩展性。 7. 观察者模式Observer Pattern 观察者模式定义了一种依赖关系当一个对象状态发生改变时所有依赖于它的对象都得到通知并被自动更新。在MyBatis中Configuration对象就是一个观察者它会监听映射文件的解析事件并在解析完成后更新自己的状态。通过观察者模式MyBatis能够动态响应配置信息的变化增强了框架的动态性和灵活性。 以上便是MyBatis中常见的几种设计模式及其应用。这些设计模式的运用大大提升了MyBatis的内聚性、可扩展性和灵活性使得MyBatis成为了Java领域广泛使用的ORM框架之一。 二、MyBatis设计模式的源码实现原理 在第一部分中我们讨论了MyBatis使用的一些关键设计模式及其作用。现在我们将深入探索这些设计模式在MyBatis源码中的具体实现原理。 工厂模式的应用 - SqlSessionFactory 实现原理 SqlSessionFactory的创建是通过SqlSessionFactoryBuilder完成的。这个过程遵循了典型的工厂模式设计SqlSessionFactoryBuilder充当工厂的角色负责生产SqlSessionFactory对象。 public SqlSessionFactory build(Reader reader) {// 使用XMLConfigBuilder解析配置文件XMLConfigBuilder parser new XMLConfigBuilder(reader, null, null);return build(parser.parse()); }在上述代码中build方法首先通过XMLConfigBuilder解析给定的配置文件然后根据解析结果构建出一个SqlSessionFactory实例。这个过程封装了对象的创建逻辑使得客户端代码无需直接与对象的创建细节打交道。 单例模式的应用 - SqlSessionFactory 实现原理 在MyBatis中通常我们会将SqlSessionFactory作为单例存在以保证全局只有一个数据库连接池从而节省资源。、 public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try (InputStream inputStream Resources.getResourceAsStream(mybatis-config.xml)) {sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new ExceptionInInitializerError(e);}}public static SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;} }在这段代码中利用静态初始化块加载配置并创建SqlSessionFactory确保了其单例性。此外通过提供一个静态方法getSqlSessionFactory来全局访问该实例进一步体现了单例模式的特点。 代理模式的应用 - Mapper动态代理 实现原理 MyBatis中对Mapper接口的实现是基于JDK动态代理的。当调用Mapper接口的方法时实际上是委托给了由MyBatis动态生成的代理类。 public class MapperProxyT implements InvocationHandler {private final SqlSession sqlSession;private final ClassT mapperInterface;public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 方法调用的处理逻辑if (Object.class.equals(method.getDeclaringClass())) {return method.invoke(this, args);}// 执行SQL操作return sqlSession.selectList(mapperInterface.getCanonicalName() . method.getName());} } 建造者模式Builder Pattern MyBatis在处理配置文件时使用了建造者模式。XMLConfigBuilder和XMLMapperBuilder是两个具体的例子它们负责解析MyBatis的配置文件和映射文件。 实现原理这段代码展示了BaseExecutor中的query方法这是一个模板方法它定义了执行查询的基本流程并将具体的查询逻辑委托给doQuery方法。子类需要根据不同的需求实现doQuery方法比如SimpleExecutor、ReuseExecutor等都有各自的实现这正是模板方法模式的典型应用。 public class XMLConfigBuilder extends BaseBuilder {private boolean parsed;private final XPathParser parser;public XMLConfigBuilder(InputStream inputStream) {this(new XPathParser(inputStream, true, null));}public Configuration parse() {if (parsed) {throw new BuilderException(Each XMLConfigBuilder can only be used once.);}parsed true;// 省略解析过程...return configuration;} }策略模式 - Strategy Pattern MyBatis的缓存策略使用了策略模式。MyBatis允许用户选择或自定义缓存实现这是通过将缓存行为抽象成接口并允许动态设置具体实现来实现的。 实现原理Cache接口定义了缓存的行为而PerpetualCache提供了Cache接口的一个基础实现。MyBatis还支持更多缓存实现如OSCache、Ehcache等开发人员可以根据需要选择或自定义缓存策略这体现了策略模式的灵活性。 public interface Cache {void putObject(Object key, Object value);Object getObject(Object key);// 更多方法... }public class PerpetualCache implements Cache {private MapObject, Object cache new HashMap();Overridepublic void putObject(Object key, Object value) {cache.put(key, value);}Overridepublic Object getObject(Object key) {return cache.get(key);}// 实现其他方法... }观察者模式 - Observer Pattern MyBatis利用观察者模式来实现插件功能。插件可以在MyBatis操作数据库的关键节点被插入比如执行查询之前。这种机制使得用户能够在不修改MyBatis核心代码的情况下扩展其功能。 实现原理Interceptor接口定义了插件需要实现的intercept方法。SomePlugin是一个具体的插件实现它可以在方法调用前后执行额外的逻辑。这种方式使得MyBatis能够在运行时灵活地扩展功能体现了观察者模式的特点。 public interface Interceptor {Object intercept(Invocation invocation) throws Throwable;// 更多方法... }public class SomePlugin implements Interceptor {Overridepublic Object intercept(Invocation invocation) throws Throwable {// 在执行前后添加额外的操作Object returnObject invocation.proceed();// 在执行后处理return returnObject;} }三、MyBatis源码解析 深入探讨MyBatis的源码对于理解其设计模式的应用至关重要。由于篇幅限制我们将通过几个关键组件的源码片段来揭示MyBatis是如何实现上文提到的设计模式的。请注意下面的代码是简化版本旨在帮助理解其核心原理。 工厂模式 - SqlSessionFactoryBuilder MyBatis通过SqlSessionFactoryBuilder创建SqlSessionFactory的过程是工厂模式的一个典型应用。 public class SqlSessionFactoryBuilder {public SqlSessionFactory build(Reader reader) {// 解析配置文件构建Configuration对象XMLConfigBuilder parser new XMLConfigBuilder(reader);Configuration config parser.parse();// 返回SqlSessionFactory实例return new DefaultSqlSessionFactory(config);} }单例模式 - SqlSessionFactory 虽然MyBatis不直接提供SqlSessionFactory的单例实现但在实际应用中开发者通常会将其实现为单例模式以下是一个简单的示例 public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static {InputStream inputStream Resources.getResourceAsStream(mybatis-config.xml);sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);}public static SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;} }代理模式 - MapperProxyFactory MyBatis使用JDK动态代理为Mapper接口生成代理对象以便拦截接口方法的调用。 public class MapperProxyT implements InvocationHandler {private final SqlSession sqlSession;private final ClassT mapperInterface;public MapperProxy(SqlSession sqlSession, ClassT mapperInterface) {this.sqlSession sqlSession;this.mapperInterface mapperInterface;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 省略具体实现return sqlSession.selectList(mapperInterface.getCanonicalName() . method.getName());} }public class MapperProxyFactoryT {private final ClassT mapperInterface;public MapperProxyFactory(ClassT mapperInterface) {this.mapperInterface mapperInterface;}public T newInstance(SqlSession sqlSession) {MapperProxyT mapperProxy new MapperProxy(sqlSession, mapperInterface);return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, mapperProxy);} }总结 每个设计模式的实现都体现了MyBatis设计的巧妙和优雅通过这些模式的应用MyBatis成功地将框架的灵活性、可扩展性和维护性提升到了一个新的高度。希望通过这三部分的解析你能对MyBatis的设计和实现有一个更加深入的理解。 如果本文对你有帮助 欢迎 关注 、点赞 、收藏 、评论 博主才有动力持续创作 博主vXiaoMing_Java 作者简介嗨大家好我是  小明 互联网大厂后端研发专家2022博客之星TOP3 / 博客专家 / CSDN后端内容合伙人、InfoQ(极客时间)签约作者、阿里云签约博主、全网 6 万粉丝博主。 文末获取联系    精彩专栏推荐订阅收藏 专栏系列点击解锁 学习路线点击解锁 知识定位 Redis从入门到精通与实战 Redis从入门到精通与实战 围绕原理源码讲解Redis面试知识点与实战 MySQL从入门到精通 MySQL从入门到精通 全面讲解MySQL知识与企业级MySQL实战 计算机底层原理 深入理解计算机系统CSAPP 以深入理解计算机系统为基石构件计算机体系和计算机思维 Linux内核源码解析 围绕Linux内核讲解计算机底层原理与并发 数据结构与企业题库精讲 数据结构与企业题库精讲 结合工作经验深入浅出适合各层次笔试面试算法题精讲 互联网架构分析与实战 企业系统架构分析实践与落地 行业最前沿视角专注于技术架构升级路线、架构实践 互联网企业防资损实践 互联网金融公司的防资损方法论、代码与实践 Java全栈白宝书 精通Java8与函数式编程 本专栏以实战为基础逐步深入Java8以及未来的编程模式 深入理解JVM 详细介绍内存区域、字节码、方法底层类加载和GC等知识 深入理解高并发编程 深入Liunx内核、汇编、C全方位理解并发编程 Spring源码分析 Spring核心七IOC/AOP等源码分析 MyBatis源码分析 MyBatis核心源码分析 Java核心技术 只讲Java核心技术
http://www.w-s-a.com/news/340388/

相关文章:

  • 佛山免费发布信息的网站oa办公系统排行榜
  • 南湖区建设街道办事处网站汕头建设银行各支行电话
  • 复古风格网站网站套餐方案
  • 界面设计做的好的网站旅游商城网站模板
  • 大型电子商务网站 服务器硬件 cpu 内存 硬盘 2014美食网站开发意义
  • 建立网站的目的和意义网站建设寻求
  • 邢台手机网站建设设计师培训心得
  • 营销网站怎么做丽水微信网站建设哪家好
  • 南昌定制网站开发多少钱东阿县城市建设局网站
  • 浙江网站建设公司南昌seo招聘
  • 工业软件有哪些专业seo站长工具全面查询网站
  • 山东兴华建设集团有限公司网站和京东一样做电子产品的网站
  • 网站建设谢辞关于h5的网站模板
  • 网站改版提交WordPress360收录
  • 省级网站 开发建设 资质在国外怎么做网站
  • 中商华兴建设有限公司网站我的世界查找建筑网站
  • 广东网站设计公司百度推广免费送网站
  • 高密做网站哪家好网站建设预算
  • 免费wordpress网站模板重庆如何做聚政网站
  • 人才网站app建设建议系统开发生命周期法的优点表现
  • 门户网站想要微信登录怎么做湖南网站seo推广
  • 襄阳 网站建设管理系统网站
  • 重庆工程建设招标投标交易信息网广州外贸seo优化
  • 一个一起做网站东莞设计兼职网站建设
  • 杭州网站程序开发公司在哪个公司建设网站好
  • 网店的网站设计方案济南手机建站价格
  • 网站做了301重定向域名会自动跳转吗唐山地方志网站建设
  • 学校网站建设说明书海南省建设执业资格注册管理中心网站
  • 东莞哪家网站建设好网站风格设定
  • 自驾游网站模板搭建wordpress步骤