【保姆级·创建对象】如何通过Supplier创建对象

news2024/11/18 21:27:07

Spring创建对象的主要方式有

  • 通过自定义BeanPostProcessor,生成代理对象InstantiationAwareBeanPostProcessor

    • createBean() -> resolveBeforeInstantiation()

  • 通过supplier创建对象

    • createBean() -> doCreateBean() -> createBeanInstance() -> obtainFromSupplier()

  • 通过FactoryMethod创建对象

    • createBean() -> doCreateBean() -> createBeanInstance() -> instantiateUsingFactoryMethod()

  • 通过反射创建对象

    • createBean() -> doCreateBean() -> createBeanInstance() -> instantiateBean()

  • 通过FactoryBean创建对象

本文介绍下最后一种,如何通过supplier创建Bean(保姆级教程,建议收藏食用(。・ω・。)ノ)

创建测试所需文件

User.java

public class User {
   private String name;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public User(){

   }
   public User(String name) {
      this.name = name;
   }
}

CreateSupplier.java

public class CreateSupplier {
   public static User createUser() {
      return new User("aqin");
   }
}

SupplierBeanFactoryPostProcessor.java

public class SupplierBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
   @Override
   public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
      BeanDefinition beanDefinition = beanFactory.getBeanDefinition("user");
      GenericBeanDefinition genericBeanDefinition = (GenericBeanDefinition) beanDefinition;
      genericBeanDefinition.setInstanceSupplier(CreateSupplier::createUser);
      genericBeanDefinition.setBeanClass(User.class);
   }
}

supplier.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id="user" class="com.aqin.custom.supplier.User"></bean>
   <bean id="supplierBeanFactoryPostProcessor" class="com.aqin.custom.supplier.SupplierBeanFactoryPostProcessor"></bean>
</beans>

TestSupplier.java

public class TestSupplier {
   public static void main(String[] args) {
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("supplier.xml");
      User user = applicationContext.getBean(User.class);
      System.out.println(user.getName());
   }
}

测试效果

​Debug

由于是测试创建Bean,我们需要在doCreateBean()上打个断点,启动debug,执行到断点位置,如下图:

​进入doCreateBean(),下一步到instanceWrapper = createBeanInstance(beanName, mbd, args);,进入createBeanInstance()方法中

​进入createBeanInstance()方法后,下一步到Supplier<?> instanceSupplier = mbd.getInstanceSupplier();这里是判断当前beanDefinition中是否包含实例供应器的

​继续下一步,我们会发现instanceSupplier=null,咦?……不应该呀?

​不用着急,我们仔细看上图中红框框圈住的内容,有一个是beanName,此时,beanName是"supplierBeanFactoryPostProcessor",并非我们要创建的"user"

所以我们直接点击下图中的Resume Program再次进入之前的断点即可

点击上图中的绿三角,就会再次停在一开始我们打断点的位置,如下图:

​此时可以看到,当前处理对象的beanName为"user",继续下一步,直到再次执行到Supplier<?> instanceSupplier = mbd.getInstanceSupplier()

​进入getInstanceSupplier(),可以发现instanceWrapper已经不是null叻

​再向下执行一步,由于instanceSupplier已经有了值,所以会进入if的逻辑,通过obtainFromSupplier()方法返回已获取到的对象

​obtainFromSupplier()从给定“供应商”处,获取Bean实例

​然后包装一下,再进行初始化

完成(。・ω・。)ノ

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

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

相关文章

行业寒冬下逆势拿到50万offer,看看大牛是怎么做到的

年薪50万&#xff0c;这个薪水我以前想都不敢想&#xff0c;我一直以为月薪2万就是软件测试的天花板。当越来越多的同行拿到更高的薪水&#xff0c;我才明白&#xff0c;限制我薪水的不是行业天花板&#xff0c;而是我的技术实力。 每天陀螺一样两点一线的在家和公司之间往返&…

Nature文章使用认证Kamiya艾美捷抗胸腺嘧啶二聚体单抗方案

细胞内、外部环境中普遍存在的DNA损伤因素会破坏遗传信息的稳定性。紫外线损伤皮肤的机制之一是损伤细胞的DNA&#xff0c;形成“晒伤细胞”&#xff0c;诱发细胞内DNA产生丰富的变异&#xff0c;主要包括环丁烷嘧啶二聚体&#xff08;CPD&#xff0c;Cyclobutane pyrimidine d…

网络安全域内用户Hash获取方式

前言 在渗透测试的过程中&#xff0c;当我们已经是域管权限时&#xff0c;就可以实现提取所有域内用户的密码哈希以进行离线破解和分析&#xff0c;这是非常常见的一个操作&#xff0c;这些哈希值存储在域控制器(NTDS.DIT)中的数据库文件中&#xff0c;并带有一些其他信息&…

5-3:Spring整合Kafka

引入依赖 spring-kafka <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka --> <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId>/*可以注释掉&#xff…

小程序webView页面转发后,进入页面空白

小程序webView页面&#xff0c;在点击右上角按钮分享后&#xff0c;进入分享的链接页面空白 重新进入页面后&#xff0c;页面空白。使用电脑打开之后报错提示如下 一、排查页面转发后&#xff0c;页面地址有没有解码 webview页面转发后&#xff0c;小程序会将url参数转码&…

Java并发-CompletableFuture的详解

目录 1 前言 2 常用方法 3 测试 3.1 runAsync&#xff1a;无返回值 和 SupplyAsync&#xff1a;有返回值 3.2 串行执行 3.3 任务3等待等任务1和任务2都执行完毕后执行 3. 4 任务3等待等任务1或者任务2执行完毕后执行 3.5 handleAsync 3.6 多任务执行 1 前言 Completable…

LabVIEW中将前面板置于所有桌面窗口的前面

LabVIEW中将前面板置于所有桌面窗口的前面 想将前面板窗口设置在所有桌面窗口的前面。前面板属性IsFrontmost&#xff08;如下图所示&#xff09;将前面板设置为仅位于所有 LabVIEW 窗口的前面。如何将前面板置于所有桌面窗口的前面&#xff1f; 解决方案 如果使用位于C:\WIN…

【JavaWeb】第七章 Tomcat

文章目录1、JavaWeb2、Web资源与Web服务器3、Tomcat的使用4、部署Web工程到Tomcat中5、工程和资源的访问6、IDEA集成Tomcat服务器7、创建动态web工程1、JavaWeb JavaWeb是指通过Java语言编写的可以通过浏览器访问的程序的总称。 请求&#xff1a; 客户端给服务器发送数据&…

java基于SSM的婚纱影楼管理系统-计算机毕业设计

开发环境 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架:SSM(springspringMVCmybatis)vue 项目介绍 婚姻是每个人人生中都非常重要的一个组成部分&#xff0c;它是一个新家庭的开始也是爱情的见证&#xff0c;所以很多人在结婚之前都会拍一套美…

数字先锋 | 农业农村部大数据公共平台基座上线,天翼云擎起乡村振兴新希望!

近日&#xff0c;由中国农业农村部大数据发展中心牵头&#xff0c;联合中国电信集团有限公司、人民数据管理&#xff08;北京&#xff09;有限公司、北京中农信达信息技术有限公司、北京农信通科技有限责任公司共同打造的“农业农村大数据公共平台基座”已正式上线&#xff0c;…

借助云的力量,重塑企业的现在和未来|re:Invent 2022 Adam Selipsky 主题演讲精华全收录

2022 亚马逊云科技re:Invent全球大会进入第二天&#xff0c;亚马逊云科技首席执行官 Adam Selipsky 发表了“如何借助云的力量&#xff0c;在未知领域抓住机遇并茁壮成长”的主题演讲。在两个小时的演讲中&#xff0c;Adam 重点围绕数据、安全、计算性能和行业应用等4个主题发布…

问题 A: 二叉排序树 - 文本输出

题目描述 给定一个序列&#xff0c;使用该序列生成二叉排序树&#xff08;也叫二叉搜索树&#xff0c;BST&#xff09;&#xff0c;然后以本题规定方法输出该二叉排序树。 例&#xff1a; 给定一个序列&#xff1a;43 25 29 67 17 88 54 47 35 62 以第一个数字&#xff08;43&…

RFID防盗安全门,自助借还书机,让图书馆发展进入新的里程碑

RFID无线射频识别是一种非接触的自动识别技术&#xff0c;它通过射频信号自动识别目标对象并获取相关数据&#xff0c;可快速进行物品追踪和数据交换&#xff0c;其识别无需人工干预。 RFID作为一种新的技术&#xff0c;它不只是简单的磁条码替代品&#xff0c;它的运作让图书馆…

为什么说新一代BI是“面向业务的可视化分析工具”?

BI工具一直被誉为数据应用的“最后一公里”&#xff0c;其原因在于BI工具可以通过简洁的方式完成数据分析&#xff0c;将数据结果直观的展现给使用者&#xff0c;达到释放数据价值的目的。 然而&#xff0c;传统BI的根本问题在于操作难度大&#xff0c;导致只能专业的IT人员进…

(02)Cartographer源码无死角解析-(33) LocalTrajectoryBuilder2D: 点云数据流向、处理、消息发布等→流程复盘

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

反复重购,资金严重浪费?企业资产需要这样管理

很多企事业资产具有数量大、种类多、价值高、使用周期长、使用地点分散&#xff0c;管理难度大。一些传统固定资产管理软件&#xff0c;痛点丛生&#xff0c;已难于满足企事业需求。 资产管理业务4大现状 01.手段滞后 资产实际的使用状态及状况无法得到及时、准确地反馈。 02.…

「Redis数据结构」RedisObject

「Redis数据结构」RedisObject 文章目录「Redis数据结构」RedisObject一、概述二、结构三、编码方式四、小结五、参考一、概述 redisObject对象非常重要&#xff0c;Redis对象的类型、内部编码、内存回收、共享对象等功能&#xff0c;都需要redisObject支持。 redis 不是一个…

DPDK EAL

DPDK全程是Intel Data Plane Development Kit&#xff0c;是一个数据平面开发集。 DPDK的主要思想 绕过内核&#xff0c;实现Zero Copy使用UIO驱动屏蔽硬中断&#xff0c;并采用PMD主动轮询&#xff0c;减少Cache Miss和切换上下文的开销使用大页内存&#xff0c;减少TLB Mis…

重磅:Docker Desktop正式集成WasmEdge。后者首登GitHubTrending

上周五&#xff0c;Docker Desktop 发布了 4.15 新版本。在这个版本中&#xff0c;Docker Desktop 正式集成了 WasmEdge 的 containerd shim&#xff0c; 并且 Docker Wasm 也从 tech preview 进入到了 beta 阶段。这意味着&#xff0c;1000 万 Docker Desktop 的用户都安装了…

代码安全与质量 | 在这个充满变数的时代,花小钱办大事

在这个充满变数的时代&#xff0c;许多企业都想要提升效率&#xff0c;但如何以同样的时间、人力成本创造出更大的价值&#xff1f;在研发领域&#xff0c;企业选择引入更好的工具来帮助交付高质量代码&#xff0c;比如Sonar&#xff0c;帮助团队充分利用时间&#xff0c;专注于…