博客
关于我
【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/

    你可能感兴趣的文章
    Position属性四个值:static、fixed、absolute和relative的区别和用法
    查看>>
    POSIX thread编程中关于临界区内条件变量的分析
    查看>>
    POSIX与程序可移植性
    查看>>
    posix多线程有感--自旋锁
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    POSIX标准和XSI扩展
    查看>>
    post install error,please remove node_moules before retry
    查看>>
    postcss-pxtorem 参数之selectorBlackList、exclude的用法
    查看>>
    Postek博思得标签打印机更换电脑,打印出来标签空白
    查看>>
    postfix+ dovecot搭建邮件服务器
    查看>>
    postfix在邮件服务器中的使用
    查看>>
    PostGIS 3.1.2软件安装详细教程(地图工具篇.8)
    查看>>
    PostGIS中获取所有EPSG的编码以及对应Proj4字符串
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    PostGIS在Windows上的下载与安装
    查看>>
    Qt开发——网络编程之UDP客户端
    查看>>
    postgis数据库优化_postgresql 性能优化
    查看>>
    postgis求面积、交集等相关函数
    查看>>
    postgis相关函数
    查看>>
    Postgres Docker版本安装mysql_fdw 插件
    查看>>