面试不慌张:一文读懂FactoryBean的实现原理

news2024/11/16 14:51:03

       大家好,我是石头~

       在深入探讨Spring框架内部机制时,FactoryBean无疑是一个关键角色,也是面试中经常出现的熟悉面孔。

       不同于普通Java Bean,FactoryBean是一种特殊的Bean类型,它的存在并非为了提供业务逻辑,而在于它具备动态创建和返回其他Bean实例的能力。

       这一特性使Spring容器在管理Bean时拥有了更高的灵活性和智能化水平。
在这里插入图片描述

1、FactoryBean接口的核心方法解析

       FactoryBean接口的核心方法主要包括以下几个:

在这里插入图片描述

  • T getObject() throws Exception: 这个方法是FactoryBean的核心实现,负责创建并返回所需的对象实例。具体实现时,开发者可以根据业务需求编写逻辑来构造Bean对象。例如,如果需要创建一个复杂对象,或者需要基于某些条件动态地生成不同的Bean,那么在这个方法中就可以实现这些复杂的创建逻辑。

  • Class<T> getObjectType(): 返回由FactoryBean创建的Bean的类型。Spring容器利用此方法来确定Bean的类型,以便正确处理依赖关系和类型转换。

  • boolean isSingleton(): 指定由FactoryBean创建的Bean是否为单例。若返回true,则Spring容器会在整个应用程序上下文中仅创建一次Bean实例;若返回false,则每次请求都会创建一个新的Bean实例。

2、FactoryBean的工作流程

       当Spring容器解析配置并遇到FactoryBean定义时,它并不直接实例化FactoryBean作为最终的Bean去使用。取而代之的是,容器会调用FactoryBean的getObject()方法,以此来获取真正需要的Bean实例。

       以下是FactoryBean发挥作用的具体步骤:

  1. 初始化FactoryBean实例:Spring容器负责创建并初始化FactoryBean对象。

  2. 执行Bean创建逻辑:容器随后调用该FactoryBean的getObject()方法,按照预定义的规则或用户自定义逻辑生产目标Bean。

  3. 遵守Bean生命周期:由FactoryBean生成的Bean同样遵循Spring Bean的标准生命周期,包括但不限于依赖注入、初始化回调等过程。

  4. 交付目标Bean:最终,客户端从Spring容器获取的实际上是FactoryBean通过getObject()方法生产的Bean,而非FactoryBean自身。
    在这里插入图片描述

3、FactoryBean示例

       下面是一个简单的Java代码示例,展示了如何实现一个自定义的FactoryBean来创建一个Book对象:

    import org.springframework.beans.factory.FactoryBean;
    import org.springframework.stereotype.Component;

    // 定义一个简单的书本实体类
    public class Book {
        private String name;
        private double price;

        // 构造函数、getter和setter省略...

        // 输出书本信息
        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", price=" + price +
                    '}';
        }
    }

    // 实现FactoryBean接口以自定义Book对象的创建过程
    @Component
    public class BookFactoryBean implements FactoryBean<Book> {

        @Override
        public Book getObject() throws Exception {
            // 在此处实现具体的创建逻辑
            Book book = new Book();
            book.setName("Spring in Action");
            book.setPrice(49.99);
            return book;
        }

        @Override
        public Class<?> getObjectType() {
            return Book.class;
        }

        @Override
        public boolean isSingleton() {
            // 假设此Book Bean为单例
            return true;
        }
    }

    // 在Spring配置或注解驱动的环境下,我们可以像这样通过FactoryBean获取Book对象
    // Spring容器会调用BookFactoryBean.getObject()方法来创建Book实例
    // 而不是直接创建BookFactoryBean自身
    @Autowired
    private Book bookFromFactoryBean;

       在上述例子中,BookFactoryBean实现了FactoryBean<Book>接口,并在getObject()方法中创建并返回了一个Book实例。当我们在Spring容器中通过Bean名称获取Book时,实际上得到的是由BookFactoryBean创建的Book对象。如果需要获取BookFactoryBean自身,需要在Bean名称前加上"&"符号。

4、结语

       面试中被问到关于FactoryBean的问题,实质上面试官是在考察候选人对Spring框架核心原理的理解深度。深入学习和理解FactoryBean有助于我们在日常开发中更好地运用Spring框架,也有利于我们进一步领会控制反转(IoC)和依赖注入(DI)的设计理念。

**MORE | 更多精彩文章**

  • 面试官:说说单点登录都是怎么实现的?
  • JWT重放漏洞如何攻防?你的系统安全吗?
  • JWT vs Session:到底哪个才是你的菜?
  • JWT:你真的了解它吗?
  • 别再这么写POST请求了~

关注公众号:石头聊技术,解锁更多Java干货文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

串口小项目 - 声控刷抖音

项目准备&#xff1a; orangepi02 语言 模块: SU-03T 电脑 接线: 语言模块 - orangepi VCC - 5V GND - GND B7(RX)--RX-5 orangepi 手机 通过usb 连接 实现思路图: 语言模块接收到语言信息&#xff0c;发送到 H616 去处理&#xff0c;H616再控制手机实现语言刷抖音的功能 …

(2022级)成都工业学院数据库原理及应用实验八: 数据库恢复技术

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、使用mysqldump实现数据库备份。 2、使用mysqldump实…

LCR 023. 相交链表

给定两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#xf…

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处&#xff1a; 对于浏览器来说&#xff0c;标签不够语义化对于搜索引擎来说&#xff0c;不利于SEO的优化 语义化标签&#xff1a; header:头部元素nav&#xff1a;导航section:定义文档某个区域的元素article:内容元素aside…

文心一言 VS 讯飞星火 VS chatgpt (241)-- 算法导论17.3 7题

七、为动态整数多重集 S (允许包含重复值)设计一种数据结构&#xff0c;支持如下两个操作&#xff1a;① INSERT(S,x) 将 x 插入 S 中&#xff1b;② DELETE-LARGER-HALF(S) 将最大的 ⌈|S|/2⌉ 个元素从S中删除。解释如何实现这种数据结构&#xff0c;使得任意 m 个 INSERT 和…

linux-centos虚拟机设置固定ip

环境准备 虚拟机版本&#xff1a;centos7 安装环境&#xff1a;vmware17 1、设置网络连接 虚拟机-设置-网络适配器-NAT模式 2、查看子网信息 编辑-虚拟网络编辑器-NAT模式-NAT设置 查看子网ip和网关ip 下一步要用 3、修改配置文件 vim /etc/sysconfig/network-scripts…

企业上云数字化转型的关键——选对服务器虚拟化

盘点市面上的主流虚拟化软件 虚拟化技术就像可以随意组合的乐高积木&#xff0c;可以高效、灵活地利用计算资源。世面上主流虚拟化很多&#xff0c;各有长处和短板。今天先来盘点一下市面上的主流虚拟化软件&#xff0c;一探究竟。 虚拟化的老牌巨头——VMware 老牌虚拟化巨…

Java数据结构-堆和优先级队列

目录 1. 相关概念2. PriorityQueue的实现2.0 搭建整体框架2.1 堆的创建和调整2.2 插入元素2.3 出堆顶元素 3. 全部代码&#xff08;包含大根堆和小根堆&#xff09;4. PriorityQueue的使用5. Top-K问题 之前我们学习的二叉树的存储方式是链式存储&#xff0c;&#xff08;不清楚…

VLOOKUP函数使用,为什么会报错“引用有问题”?

VLOOKUP函数的使用非常广泛&#xff0c;在excel2007版之后的软件中&#xff0c;使用VLOOKUP函数也许会遇到这样的场景&#xff0c;明明公式是没有问题的&#xff0c;公式还会报错“引用有问题”。 一、报错场景 输入公式后&#xff0c;回车确认&#xff0c;显示如下报错&…

嵌入式学习57-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices mknod ? 查看指令 gcc -oapp hello.c 字符设备驱动流程 字符设备程序运行流程 gcc中-c和-o是编译时可选的参数 -c …

揭阳硕榕超市管理系统的设计与实现(论文)_kaic

摘 要 在互联网高速发展环境下&#xff0c;传统的管理手段无法满足对信息的高效、快速的管理要求。为顺应时代发展的需要&#xff0c;提高超市的管理效能&#xff0c;提高超市的管理速度&#xff0c;构建一个信息化的工作流程&#xff0c;揭阳硕榕超市管理系统应运而生。 根…

Jmeter04:关联

1 Jmeter组件&#xff1a;关联 概括&#xff1a;2个请求之间不是独立的&#xff0c;一个请求响应的结果是作为另一个请求提交的数据&#xff0c;存在数据交互 1.1 是什么&#xff1f; 就是一个请求的结果是另一个请求提交的数据&#xff0c;二者不再是独立 1.2 为什么&#x…

Python 面向对象——1.基本概念

本章学习链接如下&#xff1a; 基本概念与语法 类&#xff08;Class&#xff09;&#xff1a;定义了一组对象共有的属性和方法的蓝图。类是创建对象的模板。 对象&#xff08;Object&#xff09;&#xff1a;类的实例。对象包含实际的数据和操作数据的方法。 属性&#xff0…

7.MMD 法线贴图的设置与调教

前期准备 人物 导入温迪模型导入ray.x和ray_controler.pmx导入天空盒time of day调成模型绘制顺序&#xff0c;将天空盒调到最上方给温迪模型添加main.fx材质在自发光一栏&#xff0c;给天空盒添加time of lighting材质 打开材质里的衣服&#xff0c;发现只有一个衣服文件 …

【Canvas与艺术】绘制黑白山间野营Camping徽章

【说明】 中间的山月图是借用的网上的成图&#xff0c;不是用Canvas绘制的。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head>…

微信域名防封/QQ域名防封/域名状态检测/域名防红防封API平台源码

下载地址&#xff1a;API平台源码 这套源码是使用thinkphp3.1.3开发的&#xff0c;可以在PHP5.3-5.6下运行&#xff0c;程序是有一点老了&#xff0c;但是思路仍在&#xff01;然后&#xff0c;这套源码我已经成功搭建起来了&#xff0c;后台、个人&#xff08;用户&#xff0…

跟TED演讲学英文:How AI could save (not destroy) education by Sal Khan

How AI could save (not destroy) education Link: How AI could save (not destroy) education Speaker: Sal Khan Date: April 2023 文章目录 How AI could save (not destroy) educationIntroductionVocabularyTranscriptSummary后记 Introduction Sal Khan, the founder…

【UE5 C++】VS2022下载安装

先看一下UE和VS的兼容性 &#xff08;虚幻5&#xff1a;为虚幻引擎C项目设置Visual Studio开发环境&#xff09; &#xff08;虚幻4&#xff1a;设置虚幻引擎的Visual Studio&#xff09; 为了让VS更好兼容UE5&#xff0c;因此这里下载VS2022版本 步骤 1. 进入Visual Stud…

Linux 共享内存 及 利用管道实现简单协同

共享内存&#xff08;Shared Memory&#xff09;是一种多个进程之间共享某些内存区域以进行通信的机制。这些共享的内存区域可以被多个进程访问&#xff0c;从而实现对进程间数据的快速交换。共享内存是最快的IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信…

OpenHarmony其他工具类—leveldb [GN编译]

简介 leveldb是一种快速键值存储库&#xff0c;提供从字符串键到字符串值的有序映射。 下载安装 直接在OpenHarmony-SIG仓中搜索leveldb并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/leveldb 修改添加依赖的编译脚本…