当前位置: 首页 > news >正文

FactoryBean是现在的执行时机

调用getBean方法,最终到org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons方法:

for (String beanName : beanNames) {RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {if (isFactoryBean(beanName)) {Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {FactoryBean<?> factory = (FactoryBean<?>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else {getBean(beanName);}}
}

此处遍历的beanNames就是beanDefinitionNames集合,即按注册顺序排列的 Bean 定义名称列表;

若实现了FactoryBean接口的类,其实现的是SmartFactoryBean并重写isEagerInit()方法,返回true,那么此时就会调用当前实现类的实例化以及初始化;若没返回true,那是执行时机是什么时候呢?

1.在被注入的类中

解析类的时候,会调用org.springframework.beans.factory.annotation.InjectionMetadata.InjectedElement#inject方法,其中回去获取注入的对象,

Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor)

最终调用到org.springframework.beans.factory.support.DefaultListableBeanFactory#doGetBeanNamesForType方法,此方法会遍历所有的beanDefinitionNames获取需要注入的对象,并将其放入一个list中返回,最后将其封装为一个map类型(此时key就是实现FactoryBean接口的类名,v就是其bean定义);

if (beanInstance instanceof FactoryBean) {if (!isFactoryDereference) {Class<?> type = getTypeForFactoryBean((FactoryBean<?>) beanInstance);return (type != null && typeToMatch.isAssignableFrom(type));}else {return typeToMatch.isInstance(beanInstance);}
}

即通过此处调用FactoryBeangetObjectType方法进行对比;

2)获取到map进行校验

		for (Map.Entry<String, Object> entry : candidates.entrySet()) {String candidateName = entry.getKey();Object beanInstance = entry.getValue();if ((beanInstance != null && this.resolvableDependencies.containsValue(beanInstance)) ||matchesBeanName(candidateName, descriptor.getDependencyName())) {return candidateName;}}

最后获取到bean的名称,调用getBean方法,其中在获取到对象后,会调用如下方法:

bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);

其中就是判断此对象是否实现了FactoryBean接口,若实现了,则会返回getObject创建的对象;

至此,解析结束。

相关文章:

FactoryBean是现在的执行时机

调用getBean方法&#xff0c;最终到org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons方法&#xff1a; for (String beanName : beanNames) {RootBeanDefinition bd getMergedLocalBeanDefinition(beanName);if (!bd.isAbstr…...

自定义注解使用

现象&#xff1a; 自定义注解使用 方法&#xff1a; 1&#xff1a;元注解 java.lang.annotation 下定义了元注解 Documented 文档相关 标注了此注解则会包含在javadoc文档中Retention 指定注解生命周期Target 指定注解作用范围Inherited 指定子类可以继承父类的注解Native …...

2023年全国最新高校辅导员精选真题及答案42

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 89.侵犯行为是一种故意伤害他人的行为&#xff0c;一般包括了动机、行为和后果。 答案&a…...

Python模拟星空

文章目录前言Turtle基础1.1 Turtle画板1.2 Turtle画笔1.3 Turtle画图1.4 Turtle填色1.5 Turtle写字模拟星空模拟星球浪漫星空尾声前言 Python模拟星空&#xff0c;你值得拥有&#xff01;uu们一周不见啦&#xff0c;本周博主参考网上大佬们的星空&#xff0c;给大家带来了属于…...

IDE集成开发工具-IDEA(一)之IDE的概念

IDE的概念 集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开…...

基于Java+Springboot+vue的汽车租赁系统设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;200套&#xff09; 目录 一、效果演示 二、…...

【笔记】关于Maven中<optional>标签的理解

之前我有个误区&#xff1a;子pom通过<parent>标签继承父pom&#xff0c;如果父pom中的依赖设置<optional>true</optional> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version&g…...

JavaScript函数及面向对象

JavaScript函数及面向对象 4.1、函数定义及变量作用域 定义方式一 绝对值函数 function abs(x){if(x>0){return x;}else{return -x;} }一旦执行到return代表函数结束&#xff0c;返回结果&#xff01; 如果没有执行return&#xff0c;函数执行完也会返回结果&#xff0c;…...

【chartGPT】我们要不要搞chartGPT?

话题:官兔子并未表态要研发chartGPT&#xff0c;chartGPT炒的很火&#xff0c;我们到底要不要投入研发呢&#xff1f; 问题起因:我个人是做技术的&#xff0c;也玩炒股。就昨天吧&#xff0c;看到一个热评【马斯克等呼吁暂停chartGPT5的研发&#xff0c;周鸿炜谈不发展才是最大…...

java——date时间类型操作

目录 1.date类型使用 2.获取想要的自定义时间点 3.date类型与String类型转换 4.date时间先后比较 1.date类型使用 在java中&#xff0c;日期时间用java.util.Date类来表示&#xff0c;调用默认构造器Date()&#xff0c;将会创建一个当前系统时间的Date对象&#xff0c;时间…...

应急响应——IDSIPSmsf流量后门分析

目录 0x01 网页篡改与后门攻击防范应对指南 0x02 主要需了解:日志存储,Webshel检测,分析思路等...

项目二:电子骰子

项目二&#xff1a;电子骰子 文章目录项目二&#xff1a;电子骰子一、导入(5分钟&#xff09;学习目的二、新授(65分钟)1.预展示结果(5分钟)2.本节课所用的软硬件(5分钟)3.硬件介绍(1分钟)4.图形化块介绍(1分钟)5.单个模块的简单使用(1分钟)6.电子骰子编程逻辑分析(25分钟)7.电…...

D. Genius‘s Gambit(很多情况)

Problem - D - Codeforces 已知三个整数a b k。求两个二进制整数z和y ( > y)满足1. y都由a个0和b个1组成;2. X - y(也是二进制形式)恰好有k个1。z和y不允许使用前导零。输入唯一的一行包含三个整数a, b和k (0 <a;1 <b;0<k < ab< 2- 105) -结果中0、1和1的个数…...

jsp824汽车维修保养管理系统javaEE+mysql

主要实现 1&#xff0e;车主信息管理&#xff1a;管理员发布车主信息后&#xff0c;普通用户查询到该车主信息&#xff0c;用户选择某个车主信息&#xff0c;查询车主信息&#xff0c;管理员审核添加&#xff0c;或删除车主信息。 2&#xff0e;保养信息管理&#xff1a;管理员…...

Linux下C/C++ redis协议(RESP)解析

Redis是一个开源的内存键值数据存储&#xff0c;最常用作主数据库、缓存、消息代理和队列。Redis提供了亚毫秒的响应时间&#xff0c;在游戏、金融科技、广告技术、社交媒体、医疗保健和物联网等行业实现了快速而强大的实时应用。 Redis连续五年成为开发人员最喜爱的数据库。开…...

IDEA 性能优化设置

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; “ 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;…...

蓝桥杯刷题冲刺 | 倒计时4天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;倒计时4天&#xff0c;冲冲冲&#xff01;&#xff01;&#xff01;&#x1f43e; 文章目录1.整除序列2.走方格3.前缀和4.差分矩阵5.翻硬币1.整除序列 题目 链接&#xff1a; 2065. 整除序列 - Ac…...

阿里测试7年经验,从功能测试到自动化测试,我整理的超全学习指南

做测试七年多&#xff0c;有不少人问过我下面问题&#xff1a; 现在的手工测试真的不行了吗&#xff1f;测试工程师&#xff0c;三年多快四年的经验&#xff0c;入门自动化测试需要多久&#xff1f;自学自动化测试到底需要学哪些东西&#xff1f;不得不说&#xff0c;随着行业的…...

jar加密后当作SDK给别人使用(可maven引入)

1、不加密jar&#xff0c;进行提取公共代码&#xff0c;打成jar包&#xff0c;并用maven引入 参考文章&#xff1a;以maven添加依赖的方式导入自己写的项目。springboot 提取公共类&#xff0c;多服务共用 2、加密jar&#xff0c;使用ClassFinal进行jar的加密 官网地址:Clas…...

【编程基础】032、C语言中结构体在解题中的应用

文章目录C语言中结构体在解题中的应用1、结构体之时间设计2、结构体之成绩记录3、结构体之成绩统计2C语言中结构体在解题中的应用 1、结构体之时间设计 题目描述 定义一个结构体变量&#xff08;包括年、月、日&#xff09;。计算该日在本年中是第几天&#xff0c;注意闰年问…...

【信息科学与工程学】信息科学领域工程——第二篇 材料工程10 光学材料 (1) (光通信必学必会)

表1:光学材料知识库 第一部分:光学基础理论与数学模型 编号 算法/策略名称和伪代码/数学方程式 核心数学描述/规律 关键参数/变量 物理/化学/工程意义/控制目标 典型应用场景 优点与局限 关联知识连接点 1.1.1 麦克斯韦方程组 ∇D = ρ_f ∇B = 0 ∇E = -∂B/∂t ∇…...

AI智能体技能开发实战:从工具调用到安全部署全解析

1. 项目概述&#xff1a;当AI学会“上网”与“思考”最近在折腾AI应用开发的朋友&#xff0c;估计都绕不开一个核心问题&#xff1a;如何让大语言模型&#xff08;LLM&#xff09;不只是个“聊天高手”&#xff0c;更能成为一个能独立完成复杂任务的“智能体”。你肯定遇到过&a…...

知识竞赛的“复活”机制:给落后者第二次机会

&#x1f504; 知识竞赛的“复活”机制&#xff1a;给落后者第二次机会包容偶然 挖掘潜力 见证逆袭&#x1f3af; 引言在知识竞赛中&#xff0c;胜负往往取决于临场发挥、题型适应甚至运气。一次抢答失误、一道冷门题目&#xff0c;都可能让准备充分的选手遗憾离场。&#x1…...

SpinalHDL Bool类型详解:从基础概念到实战应用

1. 项目概述&#xff1a;从Verilog的“1‘b1”到SpinalHDL的“Bool”在数字电路设计的底层&#xff0c;信号的真与假、高与低&#xff0c;构成了所有逻辑运算的基石。如果你是从Verilog或VHDL转过来的工程师&#xff0c;对wire、reg或者std_logic类型一定不陌生&#xff0c;它们…...

3分钟解锁B站评论区的“读心术“:揭秘用户真实身份的完整指南

3分钟解锁B站评论区的"读心术"&#xff1a;揭秘用户真实身份的完整指南 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分&#xff0c;支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-c…...

5G随机接入第一步:用Matlab手把手仿真ZC序列的preamble检测(附完整代码)

5G随机接入第一步&#xff1a;用Matlab手把手仿真ZC序列的preamble检测&#xff08;附完整代码&#xff09; 在5G NR系统中&#xff0c;随机接入过程是终端设备与基站建立连接的关键第一步。而其中ZC序列作为preamble的核心组成部分&#xff0c;其特性直接决定了随机接入的性能…...

别再手动对比了!用Beyond Compare 4在Ubuntu上5分钟搞定文件同步与合并

高效文件管理利器&#xff1a;Beyond Compare 4在Ubuntu中的深度应用指南 在当今快节奏的开发与运维工作中&#xff0c;文件比较与同步已成为日常工作中不可或缺的环节。无论是代码合并、配置同步还是日志分析&#xff0c;传统的手动对比方式不仅效率低下&#xff0c;还容易出错…...

别再手动搬数据了!STM32CubeMX配置SDIO DMA,让FatFs文件读写性能翻倍

STM32CubeMX实战&#xff1a;用DMA解锁SD卡与FatFs的终极性能 在嵌入式系统开发中&#xff0c;存储性能往往是制约整体效率的关键瓶颈。想象一下这样的场景&#xff1a;你的设备正在以最高优先级处理传感器数据&#xff0c;同时需要将采集结果实时写入SD卡。此时如果采用传统的…...

Wonder3D:用一张照片开启3D建模新纪元

Wonder3D&#xff1a;用一张照片开启3D建模新纪元 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion for 3D Generation 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D 还在为复杂的3D建模软件头疼吗&#xff1f;今天我要向你介绍一…...

AI系统提示词与模型仓库:提升大模型输出质量的关键

1. 项目概述&#xff1a;AI工具的系统提示词与模型仓库最近在折腾各种AI工具时&#xff0c;我越来越深刻地意识到一个核心问题&#xff1a;决定AI输出质量的&#xff0c;往往不是模型本身&#xff0c;而是你给它的“指令”。这个指令&#xff0c;在专业领域里被称为“系统提示词…...