SpringIOC之Bean的依赖注入执行逻辑

Spring Boot核心特性、注解和Bean作用域 Spring Core 是 Spring Framework 的基础,为基于 Java 的应用程序提供了全面的编程和配置模型。这里是与 Spring Core 相关的一些关键术语和概念:Bean:在 Spring 中,“bean”是由 Spring 容器管理的 Java 对象。通常使用配置元数据来定义bean,可以在 XML、Java 注释或 Java 代码中指定。控制反转(IoC):Spring 的主要原则之一是控制反转(IoC),这意味着 Spring 容器负责管理bean的生命周期并注入其依赖项。 阅读详情

Spring 只处理单例 Bean 的字段(或 Setter)注入出现循环依赖,对于构造器注入出现的循环依赖会直接抛出异常。还有就是如果是通过 denpends-on 配置的依赖出现了循环,也会抛出异常

Spring 处理循环依赖的解决方案如下:

  • Spring 在创建 Bean 的过程中,获取到实例对象后会提前暴露出去,生成一个 ObjectFactory 对象,放入 singletonFactories(三级 Map)中

  • 在后续设置属性过程中,如果出现循环,则可以通过 singletonFactories(三级 Map)中对应的 ObjectFactory#getObject() 获取这个早期对象,避免再次初始化

  • 三级缓存和ObjectFactory的延迟创建对象是解决循环依赖的核心

源码核心部分

从缓存中获取单例 Bean

会涉及到三个缓存

缓存指的就是下面三个 Map 对象:

  • singletonObjects(一级 Map):里面保存了所有已经初始化好的单例 Bean,也就是会保存 Spring IoC 容器中所有单例的 Spring Bean

  • earlySingletonObjects(二级 Map),里面会保存从 三级 Map 获取到的正在初始化的 Bean

  • singletonFactories(三级 Map),里面保存了正在初始化的 Bean 对应的 ObjectFactory 实现类,调用其 getObject() 方法返回正在初始化的 Bean 对象(仅实例化还没完全初始化好)

提前暴露当前 Bean

可以看到会将这个 ObjectFactory 往 singletonFactories (三级 Map)中存放

Keil MDK打开别人工程总报错?手把手教你修复‘找不到main.o’和‘未定义’的路径问题 本文详细解析Keil MDK工程移植时常见的'找不到main.o'和'未定义'编译错误,提供从路径修复到宏定义配置的完整解决方案。通过系统化的检查清单和预防措施,帮助开发者快速解决MDK工程迁移问题,提升嵌入式开发效率。 阅读详情

相关推荐

AutoSAR实战:手把手教你配置PNC(Partial Network Cluster)实现精准休眠与唤醒

本文详细介绍了如何在AutoSAR中配置PNC(Partial Network Cluster)实现精准休眠与唤醒,通过DaVinci Configurator工具逐步指导,结合ComM模块的协同调试,优化车载电子系统的能耗管理。文章包含实战步骤、常见错误排查及功耗优化数据,适合汽车电子开发工程师参考。

weixin_33725239的博客 465

在mapstruct中使用spring中的bean进行复杂逻辑转换

在mapstruct中,可以使用expression方式进行简单的逻辑转换,也可以调用一些工具类的静态方法,但是有很多场景的逻辑更加复杂,会需要使用spring中已经存在的bean中的逻辑或者数据进行处理,其实mapstruct也提供一种非常巧妙的方式支持这种场景。

激进的工程师的博客 2367

从Palantir到AI时代:Forward Deployed Engineer模式的深度解析

《从Palantir到AI时代:FDE模式的创新与挑战》摘要:Palantir开创的前置部署工程师(FDE)模式正在成为AI创业公司的标配。该模式通过现场工程师深入了解客户需求,填补产品与实际应用间的鸿沟,颠覆了传统SaaS规模化路径。核心优势在于将定制化服务转化为产品发现机制,特别适合高度异质化的AI市场。成功关键在于平衡定制与标准化,通过合同价值增长、产品杠杆效应等独特指标衡量成效。FDE人才需要兼具领域洞察力与快速原型能力。这一模式表明,在AI等新兴领域,深入客户现场可能比单纯追求技术突破更能创造商业

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4526

SpringIOC之@Bean 等注解的实现原理

我们了解到@Component注解(及其派生注解)标注的 Class 类都会被解析成 BeanDefinition(Bean 的“前身”)然后实例化为早期Bean,再进行Bean的属性注入,最后会被初始化成完整Bean对象(如果需要代理则会创建Bean代理对象)。而@Bean注解不是@Component的派生注解,且用于标注方法,使用方法名作为BeanName,返回值作为Bean,那么Spring 中是如何解析@Bean注解的呢?

Coder_Boy_的博客 1695

海康读码器上位机开发避坑指南:IDMVS客户端之外,如何用C# SDK搞定扫码、数据比对与实时控制?

本文详细介绍了如何利用海康读码器的C# SDK进行二次开发,实现从基础扫码到复杂工业控制的全流程解决方案。内容涵盖SDK架构解析、多设备管理系统构建、业务逻辑与设备控制实现,以及系统集成与性能优化等关键环节,为工业自动化领域的开发者提供实用指南。

weixin_30642561的博客 550

【HAL库】STM32CubeMX开发----STM32F407----ETH+LWIP----TCPclient客户端

STM32F407开发板 为TCPclient客户端,PC端 为TCPserver服务端,相互之间的发送和接收实验。

MQ0522的博客 3046

4、IOC 之Bean的依赖关系

4、IOC 之Bean的依赖关系

天行健,君子以自强不息 520

英伟达 Jetson AGX Thor 官方入门教程(二)CUDA、Docker、JetPack 设置

本文详细介绍了NVIDIA Jetson AGX Thor开发套件的安装与配置流程。主要内容包括:1) BSP安装的三种方法(Jetson ISO、SDK Manager和Linux刷写脚本)及其适用场景;2) Docker环境的完整配置步骤及测试方法;3) CUDA工具包的两种安装方式(容器化和原生安装)及其性能对比;4) JetPack SDK的安装选项。文章提供了详细的命令行操作指南和故障排除建议,帮助开发者快速搭建AI开发环境,充分发挥Jetson平台的硬件性能优势。

机器人控制与仿真应用 1731

Spring-Bean的动态注入

如果有两个类实现了同一个接口,那么@Autowired实现哪个类的实例,取决于你如何使用@Qualifier注解来指定要注入的实现类。如果没有指定@Qualifier注解来区分它们,那么@Autowired注入时会报错,因为Spring无法确定要注入哪个实现类。@Autowired是Spring框架中的一个注解,它可以对类成员变量、方法及构造函数进行标注,让 Spring 完成 bean 自动装配的工作。在yml文件中,使用@Qualifier注解来指定要注入的实现类。这样就可以指定要注入AImpl了。

Cartel的专栏 1630

《网络安全自学教程》- Windows安全机制:安全标识符,身份鉴别和访问控制

这篇文章详细介绍Windows和Linux如何标识用户,如何根据标识验证用户身份,如何根据用户身份做访问控制。

wangyuxiang946的博客 1万+

UG\NX二次开发 判断对象是虚线还是实线

网友提问“怎么区分虚线实线”,这个可以通过函数判断。

王牌飞行员_里海的博客 357

口水话spring bean注入的执行过程

首先说下这几个接口: 1.BeanNameAware bean实现这个接口可以获取该bean的id 2.BeanFactoryAware bean实现这个接口可以获得bean工厂 3.InitializingBean (耦合性高)(注解 @PostConstruct) 类似于init-method 但是在init-method之前执行 4.DisposableBean (耦合性高)(注解

allen的博客 4071

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring两大核心---------IOC的理解(待完善)

Spring Ioc 的理解

Freelife的博客 217

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SpringIOC之Bean对象属性注入和依赖注入

spring Bean对象属性注入和依赖注入手写实现

小凯的博客 1283

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SpringDI依赖注入和SpringIOC容器对Bean的管理

bean>标签是Spring XML配置文件中最基本的构建块,用于定义Spring容器中的Bean。简单来说,Bean代表被IOC容器管理的对象,我们通过配置文件或注解,告诉IOC容器帮助我们管理哪些对象。

weixin_71072718的博客 1000

SpringIOC如何注册管理bean?

SpringIOC是Spring的核心,本文从底层描述了bean的注册注入的方式,最后列出了bean的生命周期。

DHG2012的博客 1431

SpringIOC之创建Bean的核心方法doGetBean

面向资源(XML、Properties)面向注解定义的 Bean 是如何被解析成 BeanDefinition(Bean 的“前身”),并保存至 BeanDefinitionRegistry 注册中心里面,实际也是通过 ConcurrentHashMap 进行保存。Spring 底层 IoC 容器 DefaultListableBeanFactory,实现了 BeanFactory 和 BeanDefinitionRegistry 接口,这个时候它处于“就绪状态”,当我们显示或者隐式地调用。

Coder_Boy_的博客 729

SpringIOC的模拟实现

容器的初始化、Bean 实例的创建与依赖注入,以及最终调用。方法,对指定目录下的所有文件进行递归扫描,将文件路径存于。// 我们所持有的所有对象 在beans中。综上所述,整个程序的运行调用流程涵盖了。// 从beans 中获得对应的对象。//field 需要由我们来赋值。3. 获取Bean实例并调用方法。方法,设定基础路径和基础包名。注解标记的类的实例,将其存储在。// 根据当前域中的类型的名字。注解标记的字段进行依赖注入。列表,运用反射机制创建被。方法来执行具体业务逻辑。

m0_73971785的博客 950

SpringIOC之Bean属性填充的逻辑

在 Bean 的实例化阶段获取到的就是一个 BeanWrapperImpl 对象,所以这里调用的就是当前 Bean 的。是 MutablePropertyValues 类型,则可能已经处理过了,否则,获取所有的属性值集合,放入。属性描述器,获取到对应的写方法,然后通过反射机制设置当前 Bean 的属性值。属性值已经转换了,则将这些属性值设置到当前 Bean 中(反射机制),如果属性值不为空,且不需要每次都处理,则设置为已转换。没有转换过,则获取所有的属性值集合,放入。设置转换后的值,避免上面的各种判断。

Coder_Boy_的博客 631

【Spring】二、SpringIOC Bean的初始化流程

【Spring】二、SpringIOC Bean的初始化流程

weixin_43333483的博客 523

【Java SpringIOC与ID随感录】 基于 XML 的 Bean 装配

也就是说,对象的创建和依赖关系的维护从程序员的手中转移到 BeanFactory 我们将这个现象称之为控制反转(IOC),在 BeanFactory 工厂中负责注入每一个依赖关系的这种行为称之为(ID)。我们发现结果为 true ,说明创建的是同一个对象,所以这种默认标签 singleton 创建的是单例的。我们的实体类的属性赋值,是 IOC 通过 property 中的 value 标签直接赋值给对象属性吗?他⽀持⼴泛的应⽤场 景,有着活跃⽽庞⼤的社区,这也是 Spring 能够⻓久不衰的原因。

2301_79201049的博客 1303

SpringIOC

控制反转,依赖注入。

Junhe4512的博客 997

SpringIoC依赖注入的过程(六)

SpringIoC依赖注入的过程(六)     前几篇文章详细地解读了Spring的依赖注入的过程,触发依赖注入的是getBean方法,依赖注入发生的地方是populateBean方法,而获取依赖bean的实例还是通过getBean方法。截止到上文已经解读完populateBean的全部逻辑,本文介绍下,依赖注入之后bean的初始化操作。回到AbstractAutowireCapableBean

hongxingxiaonan的专栏 4152

springioc之依赖注入

1.1.2 IoC能做什么 IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使...

weixin_30914981的博客 98

SpringIoC的实现机制是什么?

SpringIoC的实现机制是什么?

java1234的博客 691

SpringIOC加载过程

Spring IOC容器容器启动时首先解析配置生成BeanDefinition并注册到BeanFactory;然后通过BeanFactoryPostProcessor修改Bean定义;接着实例化Bean并进行依赖注入;最后执行初始化流程(包括Aware接口回调、BeanPostProcessor处理及自定义初始化方法)。整个生命周期包括解析注册、实例化、初始化和销毁四个阶段,通过扩展点(BeanFactoryPostProcessor、BeanPostProcessor等)实现灵活控制,完成对Bean的托管

lianghl_wb的博客 884
上一篇: SpringIOC之Bean属性填充的逻辑
下一篇: SpringIOC之循环依赖问题思考
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值