博客
关于我
【spring】BeanFactory与FactoryBean的区别
阅读量:485 次
发布时间:2019-03-07

本文共 2513 字,大约阅读时间需要 8 分钟。

FactoryBean的深入解析——从MyBatis到Spring的实践

引言

在Spring的IOC容器中,BeanFactory作为生产bean的核心工厂,早在学习IOC的第一课就已出现。通过BeanFactory,我们可以创建并获取所需的bean。然而,在获取bean之前,我们需要事先定义bean的构成。这种定义方式主要包括XML配置和注解(如@Bean、@Service)等,却往往遇到一种问题:某些bean的功能和实现细节在编码时才变得清晰

例如,在MyBatis中,UserMapper等mapper类的定义往往需要一个标准化的SQL语句,这使得手动为每个mapper进行定义变得繁琐。这种 boilerplate code(多余的代码)问题催生了coding pattern(编码模式)的优化方案——通过使用注解(如@Select)和标准化的XML标签,我们可以简化mapper的定义过程。这种方法的前提,是在代码执行时,通过FactoryBean的定制化流程,深入实现每个mapper的具体功能。

这篇文章将通过两个维度展开探讨FactoryBean的应用场景:(1)源代码解析,(2)框架实践中的应用案例。


为什么需要FactoryBean?

在BeanFactory中,我们可以生产各种类型的bean。然而,并非所有bean都可以在编码期事先完全定义。例如,在MyBatis中,UserMapper需要一个特定的SQL语句,OrderMapper需要与数据库交互的操作,而GoodsMapper则可能承担其他数据处理任务。

这种灵活性导致了一个问题:如何在创建bean的同时,允许其在运行时以灵活的方式实现细节功能?

进入FactoryBean的概念:FactoryBean是一种专门用于生产特定类型bean的工厂,它由三个核心方法定义——getObject(), getObjectType(), 和 isSingleton()。这些方法赋予FactoryBean高度的灵活性,使其成为实现动态bean创建的关键工厂。

通过FactoryBean,我们可以为一个bean定义其类型、单例模式以及自定义的创建流程。例如,在MyBatis中,MapperFactoryBean通过getObject()方法返回一个生成的Mapper实例,而实际的功能实现则通过解析注解或XML配置完成。这使得每个Mapper类只需定义与数据库交互的逻辑,而FactoryBean负责其它复杂性。

通过这种方式,FactoryBean成为实现懒初始化、动态bean创建以及高级 IOC特性的核心工具。


MyBatis的MapperFactoryBean:源码解析

在深入理解FactoryBean之前,了解其在特定框架中的应用是非常重要的。以MyBatis的MapperFactoryBean为例,我们可以清楚地看到FactoryBean的核心作用。

  • 基本流程

    • MapperFactoryBean的getObject()方法执行如下流程:
      • 根据beans.xml或Annotation的定义,获取对应的SQL语句。
      • 动态生成一个代理类,这个代理类代理实现了目标Mapper接口。
      • 返回该代理对象。
  • 代码示例

    public interface MapperFactoryBean
    { String SQL 것도}`>`; Class
    getObjectType(); boolean isSingleton(); // 默认单例模式}
  • 该接口定义了$getObjectType()、isSingleton()和getObject()三个核心方法。通过实现这些方法,开发者可以定制 Mapper的创建过程。此外,MyBatis还提供了默认实现,这使得开发者无需重复劳动,即可享受FactoryBean带来的灵活性。


    类型化与功能单一:Feign中的FactoryBean

    Feign是Spring Cloud组件中的一部分,用于创建REST客户端。与MyBatis相似,Feign中的FactoryBean用于定义和创建特定类型的客户端。

  • 功能特点

    • Feign客户端(FeignClient)是一个功能单一的bean,只负责接口调用。
    • FactoryBean的作用在于,根据开发者的需求,动态创建满足特定接口的客户端实例。
  • 与MyBatis的异同点

    • 共性:都定义了一种类型的bean,且在创建时可灵活实现其功能。
    • 差异:MyBatis的Mapper专注于数据库交互,而FeignClient专注于接口调用。
  • 这样的设计使得FactoryBean成为一个通用的模式,可以在各个框架中找到其身影。


    FactoryBean的广泛应用:Quartz与Redis

    FactoryBean的应用范围远不局限于MyBatis和Feign。例如,在Quartz图表框架中,JobDetailFactoryBean用以创建_job_详细信息。Redis中的RedisClientFactoryBean则用于创建Redis客户端。此外,Spring的Security框架中,UserDetailsManagerResourceFactoryBean用以管理用户相关数据。

    这些实践表明,FactoryBean的核心作用是为特定类型的对象创建和管理实例,在不同的场景中提供灵活性和可扩展性。


    总结

    FactoryBean作为Spring IOC中的核心概念,是实现懒加载、动态bean创建和灵活配置的重要工具。通过源码分析和框架实践,我们发现FactoryBean的意义在于:

  • 定义bean的类型和组成方式。
  • 提供灵活的创建和获取机制。
  • 支持单例模式和其他行为定制化。
  • 尽管FactoryBean在开发过程中不那么常见,但在复杂的框架中其身影却无处不在。理解FactoryBean的核心机制,为我们理解更复杂的Spring IOC容器操作打下了坚实基础。

    转载地址:http://obgdz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现查找整数数组中给定的最小数字算法(附完整源码)
    查看>>
    Objective-C实现查找给定节点数的树中可能的二叉搜索树的数量树算法(附完整源码)
    查看>>
    Objective-C实现查找链表的中间元素算法(附完整源码)
    查看>>
    Objective-C实现样条插值(附完整源码)
    查看>>
    Objective-C实现根据cpu和磁盘序列号生成注册码( 附完整源码)
    查看>>
    Objective-C实现格雷码序列算法(附完整源码)
    查看>>
    Objective-C实现桥接模式(附完整源码)
    查看>>
    Objective-C实现检查一个数字是否可以被另一个数字整除算法(附完整源码)
    查看>>
    Objective-C实现检查一年是否是闰年算法 (附完整源码)
    查看>>
    Objective-C实现检查三个点在 3D 中是否共线算法(附完整源码)
    查看>>
    Objective-C实现检查字符串是否包含字母表中所有字母的算法(附完整源码)
    查看>>
    Objective-C实现检查字符是否为字母算法(附完整源码)
    查看>>
    Objective-C实现检查数字是否为偶数算法(附完整源码)
    查看>>
    Objective-C实现检查数字是否为奇数算法(附完整源码)
    查看>>
    Objective-C实现检查给定图中是否存在循环算法(附完整源码)
    查看>>
    Objective-C实现检查给定字符串是否在camelCase中算法(附完整源码)
    查看>>
    Objective-C实现检查给定的字符串是否在kebabcase中算法(附完整源码)
    查看>>
    Objective-C实现检查给定的字符串是否在snake_case中算法(附完整源码)
    查看>>
    Objective-C实现检查给定的字符串是否是扁平(全部小写)的算法(附完整源码)
    查看>>
    Objective-C实现检检查回文字符串(区分大小写)算法(附完整源码)
    查看>>