3分钟了解FactoryBean的作用和底层工作原理

news2024/11/24 3:39:36

大家好,我是冰点,本节我们通过对FactoryBean 接口源码解析,以及使用示例剖析,让大家3分钟了解FactoryBean的作用和底层工作原理。以及FactoryBean的使用场景,学以致用。
在这里插入图片描述

FactoryBean是Spring框架中的一个接口,用于创建和管理其他Bean实例的对象。FactoryBean的底层工作原理是通过实现FactoryBean接口并实现其中的方法来创建和管理Bean实例。

以下是FactoryBean的代码注释和解释:

1. FactoryBean 接口源码解析

public interface FactoryBean<T> {
    
    // 获取由此工厂创建的对象实例
    T getObject() throws Exception;

    // 获取由此工厂创建的对象实例的类型
    Class<?> getObjectType();

    // 判断由此工厂创建的对象实例是否为单例模式
    default boolean isSingleton() {
        return true;
    }
}
  • getObject()方法:获取由此工厂创建的对象实例,可以在此方法中编写自定义的创建逻辑,例如从外部资源获取对象实例。
  • getObjectType()方法:获取由此工厂创建的对象实例的类型,Spring框架可以利用此方法来确定依赖注入时需要注入的具体类型。
  • isSingleton()方法:判断由此工厂创建的对象实例是否为单例模式。默认情况下,FactoryBean创建的对象实例是单例模式,但是可以通过覆盖此方法来改变对象实例的作用域。

2. FactoryBean 使用代码示例

一个简单的FactoryBean示例代码,咱们创建一个随机数生成器的实例:

import java.util.Random;
import org.springframework.beans.factory.FactoryBean;

public class RandomNumberFactoryBean implements FactoryBean<Random> {

    private int seed;

    public void setSeed(int seed) {
        this.seed = seed;
    }

    @Override
    public Random getObject() throws Exception {
        return new Random(seed);
    }

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

    @Override
    public boolean isSingleton() {
        return true;
    }
}
  1. RandomNumberFactoryBean实现了FactoryBean接口,并实现了getObject()、getObjectType()和isSingleton()方法。
  2. 在getObject()方法中,它返回了一个由seed属性指定的随机数生成器的实例。在getObjectType()方法中,它返回了该实例的类型,即Random类。在isSingleton()方法中,它指定了该实例是一个单例模式的Bean。

要使用注解方式实例化RandomNumberFactoryBean,可以使用@Configuration@Bean注解。

首先,创建一个配置类,使用@Configuration注解标记该类为配置类。然后,在该类中创建一个用于实例化RandomNumberFactoryBean@Bean方法,如下所示:

import java.util.Random;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public RandomNumberFactoryBean myRandom() {
        RandomNumberFactoryBean factoryBean = new RandomNumberFactoryBean();
        factoryBean.setSeed(12345);
        return factoryBean;
    }
}

在这个示例中,AppConfig类使用@Configuration注解标记为配置类。然后,它定义了一个名为myRandom@Bean方法,该方法返回一个RandomNumberFactoryBean实例,并为其设置seed属性值为12345。

最后,在Spring应用程序中,使用AnnotationConfigApplicationContext类来加载该配置类,如下所示:

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MyApp {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Random random = context.getBean("myRandom", Random.class);
        int number = random.nextInt();
        System.out.println("Random number: " + number);
        context.close();
    }
}

在这个示例中,MyApp类使用AnnotationConfigApplicationContext类来加载AppConfig配置类,并从容器中获取myRandom Bean实例。然后,它使用该实例生成一个随机数,并将其输出到控制台。

使用注解方式实例化RandomNumberFactoryBean与使用XML配置方式实例化它的区别在于,我们可以在@Bean方法中直接创建RandomNumberFactoryBean实例,并为其设置属性值,而不需要使用XML配置文件。这种方式更加便捷和灵活,可以更方便地进行测试和修改。

3. 核心几个点

  1. 当Spring容器启动时,它会扫描应用程序中的所有Bean定义,并实例化那些需要实例化的Bean。如果遇到实现了FactoryBean接口的Bean定义,Spring将会为该Bean创建一个特殊的代理对象,以便在需要时调用FactoryBean的方法来创建实际的Bean实例。

  2. 当需要使用由FactoryBean创建的Bean时,Spring将会调用代理对象的getObject()方法来获取实际的Bean实例。如果需要,Spring还可以调用代理对象的getObjectType()方法来确定实际Bean实例的类型。

  3. 如果FactoryBean创建的Bean是单例模式,那么Spring将在第一次调用getObject()方法时创建实例,并将其缓存起来。以后每次调用getObject()方法时,都会返回同一个实例。如果FactoryBean创建的Bean不是单例模式,则每次调用getObject()方法时都会创建一个新的实例。

4. FactoryBean 到底能干什么

FactoryBean允许我们在创建Bean实例时编写自定义的逻辑,并且可以通过其返回的实际Bean实例类型来实现更精细的依赖注入。同时,Spring框架还提供了一些内置的FactoryBean实现,例如ProxyFactoryBeanJndiObjectFactoryBean,可以帮助我们更方便地创建一些常见的Bean实例。

基本上三分钟差不多了,希望对大家有所帮助,如果有问题可以评论区或者私信留言。以上就是今天总结的所有内容,谢谢大家阅读。

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

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

相关文章

基于 resnet 对 CIFAR-10 图片进行分类和网络微调

本文基于李沐老师的 实战 Kaggle 比赛&#xff1a;图像分类 (CIFAR-10) 文章目录 数据格式数据加载标签转化划分数据集查看数据搭建网络主训练函数网络训练 数据格式 CIFAR-10 下载地址&#xff1a;https://www.kaggle.com/competitions/cifar-10/data 下拉到最下面有一个 Do…

JavaScript中的Event(事件)详解

Event 对象 Event 对象代表事件的状态&#xff0c;比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 事件通常与函数结合使用&#xff0c;函数不会在事件发生前被执行&#xff01; 事件句柄 (Event Handlers) HTML 4.0 的新特性之一是能够使 HTML 事…

Maven uber-jar(带依赖的打包插件)maven-shade-plugin

文章目录 最基础的 maven-shade-plugin 使用生成可执行的 Jar 包 和 常用的资源转换类包名重命名打包时排除依赖与其他常用打包插件比较 本文是对 maven-shade-plugin 常用配置的介绍&#xff0c;更详细的学习请参照 Apache Maven Shade Plugin 官方文档 通过使用 maven-shade…

BetaFlight飞控启动运行过程简介疑问跟踪

BetaFlight飞控启动&运行过程简介疑问跟踪 1. 源由2. 【已解存疑】问题一&#xff1a;6.1 Why desiredPeriodCycles is so important to Betaflight task?3. 【已解】问题二&#xff1a;6.2 What root cause has made gyro task to been overrun, so scheduler has to ski…

轮式机械臂小车实现语音控制

1. 功能说明 本文实例将实现语音控制R214e样机运动&#xff08;前进、后退、左转、右转、拿起、放下&#xff09;的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#x…

港科夜闻|推进湾区产学研融合发展,香港科大(广州)—广州市属国企校企合作专题交流会圆满举行...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、推进湾区产学研融合发展&#xff0c;香港科大(广州)—广州市属国企校企合作专题交流会圆满举行。本次交流会由香港科大(广州)、广州市人民政府国有资产监督管理委员会主办&#xff0c;越秀集团协办&#xff0c;旨在充分发…

springboot+jsp网上图书商城销售系统java

开发环境 开发语言&#xff1a;Java 框架&#xff1a;springboot 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven…

ubuntu 20.04虚拟内存

ubuntu 20.04虚拟内存 1. 查看自己的虚拟内存 使用top命令或者使用free命令 2. 创建虚拟内存配置文件 # 新建文件夹 cd ~ mkdir swap cd swap# bs 为块的大小&#xff0c;count 创建多少个块 sudo dd if/dev/zero ofswapfile bs1M count2048# 修改权限 sudo chmod 0600 …

系统分析师:六、企业信息化战略与实施 练习题

目录 1、十二五的七大国家战略新兴产业体系 2、标准化的三个方面 3、信息的属性 4、电子政务描述 5、数据产品管理 6、企业门户 7、企业应用集成 8、电子商务标准体系 9、电子商务标准范畴 10、知识管理显性和隐形知识 11、决策支持系统 12、CRM解决方案 13、CRM核…

用Vue写教务系统学生管理

文章目录 一.首先创建新的Demo二.在APP里面绑定DemoStudent三.源码附上四.效果图&#xff08;新增记录还未实现&#xff09; 一.首先创建新的Demo 二.在APP里面绑定DemoStudent <template><img alt"Vue logo" src"./assets/logo.png"><!--…

华为OD机试真题 Java 实现【最小的调整次数】【2023Q1 100分】

一、题目描述 有一个特异性的双端队列&#xff0c;该队列可以从头部或尾部添加数据&#xff0c;但是只能从头部移出数据。 小A依次执行2n个指令往队列中添加数据和移出数据。 其中n个指令是添加数据 (可能从头部添加、也可能从尾部添加)&#xff0c;依次添加1到n&#xff0c…

超稳定ChatGPT镜像网站,小白适用,赶紧收藏【持续更新中】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

无代码开发引路,重塑企业数字生产力

互联网时代&#xff0c;信息的传递与共享成为企业运营的核心环节。传统的软件开发模式已经不能满足企业数字化转型的需要&#xff0c;而无代码开发平台可以在不改变底层技术架构的前提下&#xff0c;提供一种高效、低成本、灵活、易用的软件开发解决方案。相较于传统代码编写&a…

[山海关crypto 训练营 day13]

日常鼓励自己&#xff1a;世界上只有想不通的人&#xff0c;没有走不通的路。 [长安杯 2021]checkin 题目代码和数据 from Crypto.Util.number import * from secret import flag p getPrime(1024) q getPrime(16) n p*q m bytes_to_long(flag) for i in range(1,p-q):m…

事务AOP

事务&AOP 事务管理 在数据库中我们已经学过事务了。 事务是一组操作的集合&#xff0c;它是不可再分的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者撤销操作请求。所以这组操作要么是同时成功&#xff0c;要么同时失败。 事务的操作主要…

【共用体和枚举】

共用体 一种构造类型的数据结构 共用体和结构体类似&#xff0c;也是一种构造类型的数据结构。 既然是构造类型的&#xff0c;就需要先定义出类型&#xff0c;然后用类型定义变量。 定义共用体类型的方法和结构体非常相似&#xff0c;把struct 改成union 就可以了。 在进行某…

美颜SDK的应用与优化:一次全面探究

在直播过程中&#xff0c;美颜技术可以帮助主播实现更好的视觉效果&#xff0c;从而吸引更多的关注和粉丝。因此&#xff0c;直播美颜SDK的应用和优化已经成为了直播行业中的一个重要研究方向。 一、直播美颜SDK的应用 1. 美颜滤镜 美颜滤镜是直播美颜SDK中最常用的一种技术…

【Mybatis】Mybatis处理一对多、多对多关系映射-四

唠嗑部分 上篇文章我们说了Mybatis中ORM映射的几种方式&#xff0c;相关文章&#xff1a; 【Mybatis】简单入门及工具类封装-一 【Mybatis】如何实现ORM映射-二 【Mybatis】Mybatis的动态SQL、缓存机制-三 这篇文章我们来说说Mybatis如何处理一对一、一对多、多对多的关系映射…

Linux下网络编程(2)——socket的函数们

accept()函数 服务器调用 listen()函数之后&#xff0c;就会进入到监听状态&#xff0c;等待客户端的连接请求&#xff0c;使用 accept()函数获取客户端的连接请求并建立连接。函数原型如下所示&#xff1a; int accept(int sockfd, struct sockaddr *addr, socklen_t *addrle…

RK3588光电载荷处理板研制进展

本来就是一个很小众的市场&#xff0c;但是偶尔也会有同行询问&#xff0c;这儿就简单汇报一下后期的进展 板子已经开发完成&#xff0c;并有幸得到了两个订单&#xff0c;虽然量不是很大&#xff0c;但是也很开心由于一段时间的努力和付出&#xff0c;将该设备应用在了国防事业…