前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring Bean的加载

Spring Bean的加载

作者头像
WindWant
发布于 2020-09-11 02:57:42
发布于 2020-09-11 02:57:42
37700
代码可运行
举报
文章被收录于专栏:后端码事后端码事
运行总次数:0
代码可运行

一、Spring加载bean的原则

不等bean创建完成就会将创建bean的ObjectFactory提早曝光加入到缓存中。

单例bean在Spring容器里只会创建一次,后续创建时会首先从缓存中获取,尝试加载,不成功则从singletonFatories中加载。

当存在循环依赖的时候,依据Spring的加载bean原则,下一个bean需要依赖上一个bean的时候直接使用ObjectFactory。

缓存中保存的是bean的原始状态,需要进行bean的实例化操作。

Spring初始化bean的时候,会首先初始化这个bean所对应的依赖。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.springframework.beans.factory;

/**
* Interface to be implemented by objects used within a {@link BeanFactory}
* which are themselves factories. If a bean implements this interface,
* it is used as a factory for an object to expose, not directly as a bean
* instance that will be exposed itself.
*/
public interface FactoryBean<T> {

  /**
    * Return an instance (possibly shared or independent) of the object
    * managed by this factory.
    */
  T getObject() throws Exception;

  /**
    * Return the type of object that this FactoryBean creates,
    * or {@code null} if not known in advance.  
    */
  Class<?> getObjectType();

  /**
    * Is the object managed by this factory a singleton? That is,
    * will {@link #getObject()} always return the same object
    * (a reference that can be cached)?
    * 单例对象会放在Spring单例缓存池中
    */
  boolean isSingleton();

}

二、工厂方法配置bean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="book" class="com.xxx.model.BookFactory"/>

BookFactory实现了FactoryBean,则当使用getBean("book")时,返回FactoryBean#getObject()方法返回的对象,即FactoryBean#getObject()代理了getBean()方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Book book = ctx.getBean("book");

如果要获取BookFactoryBean对象,则需要使用前缀“&”,使用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BookFactory bookFactory = ctx.getBean("&book");

三、单例Bean(singleton)获取

singletonObjects<BeanName, BeanInstance>.get(beanName):Map单例缓存获取。synchronized(this.singletonObjects),全局变量同步。

↓↓

↓↓==Null

↓↓

earlySingletonObjects<BeanName, BeanInstance> .get(beanName):处理循环引用依赖检测。

↓↓

↓↓==Null

↓↓

singletonFactories<BeanName, BeanFactory> .get(beanName):调用相应单例创建工厂getObject()返回Bean对象。

↓↓

-->earlySingletonObjects.put(beanName, singletonObject)存储获取的Bean实例。

--> singletonFactories.remove(beanName)移除beanName对应单例工厂。

四、Bean创建

if singleton,清除缓存。

实例化Bean(createBeanInstance),BeanDefinition=》BeanWrapper。

使用工厂方法创建:RootBeanDefinition存在factoryMethodName,或配置了factory-method=》instantiateUsingFactoryMethod()

↓↓

↓↓<不存在>

↓↓

根据参数选择相应的构造函数初始化

↓↓

↓↓<不存在>

↓↓

默认构造函数实例化。

MergeBeanDefinitionPostProcessor:合并后处理,注解处理位置。

依赖处理。

属性填充。

循环依赖检查,Spring处理循环依赖只对singleton有效。

注册DisposableBean,处理destroy-method。

完成创建。

五、Bean初始化

Aware方法,Post处理,Init处理。

Aware:注入相应资源。

PostProcessor:预置处理。

Init处理 :配置init-method或者继承InitializingBean#afterPropertiesSet()方法。afterPropertiesSet先于init-method。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【死磕 Spring】----- IOC 之从单例缓存中获取单例 bean
从这篇博客开始我们开始加载 bean 的第一个步骤,从缓存中获取 bean,代码片段如下:
用户1655470
2018/11/06
1.3K0
Spring源码分析:bean加载流程
在Spring中,Bean的加载和管理是其核心功能之一,包括配置元数据解析、Bean定义注册、实例化、属性填充、初始化、后置处理器处理、完成创建和销毁等步骤。
后台技术汇
2024/10/14
950
Spring源码分析:bean加载流程
Spring的Bean加载流程
Spring IOC容器就像是一个生产产品的流水线上的机器,Spring创建出来的Bean就好像是流水线的终点生产出来的一个个精美绝伦的产品。既然是机器,总要先启动,Spring也不例外。因此Bean的加载流程总体上来说可以分为两个阶段:
全栈程序员站长
2022/06/29
4880
Spring的Bean加载流程
Spring Bean的解析和加载详细解释
Core Container 包含 Core,Beans,Context,Expression Language 模块 Core 和 Beans 提供 IOC 和 依赖注入特性. Context 提供了类似JNDI注册器的框架, ApplicationContext 接口是Context的关键 EL 用于运行时的查询和操作
Tim在路上
2020/08/04
4880
Spring源码解析(五)Spring 加载bean 依赖注入
至此,我们分析过后,可以简单的归纳一下Spring IOC容器的过程 一、Resource定位过程 这个Resource定位指的的是BeanDefinition的资源定位,他由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一接口,对于这些BeanDefinition的存在形式,相信大家都不会感到陌生,比如,在类路径中的Bean定义信息可以使用FileSystemResouce来进行抽象;在类路径中的Bean定义信息可以使用前面提到的ClassPathResource来使用,等待;这个定位过程类似于容器寻找数据的过程,就像用水桶装水先要把水找到一样;
石臻臻的杂货铺[同名公众号]
2021/07/14
5950
Spring读书笔记——bean创建(下)
有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充。 《Spring读书笔记——bean加载》——Spring如何加载消化一个xml配置文件 《Spring读书笔记——bean解析》——Spring如何将xml文件的各种标签转换为BeanDefinition并注册到Spring容器下 《Spring读书笔记——bean创建(上)》——概述Spring如何从容器中取出需要的那个Bean 从缓存中加载单例 protected Object g
JackieZheng
2018/01/16
6180
Spring读书笔记——bean创建(下)
Spring源码解析(四):单例bean的创建流程
冬天vs不冷
2025/01/21
1260
Spring源码解析(四):单例bean的创建流程
Spring IOC Notes-Core method analysis
摘要: Spring IOC 学习笔记-核心方法分析 正文: 核心方法分析 scan–>doScan protected Set<BeanDefinitionHolder> doScan(String... basePackages) { Assert.notEmpty(basePackages, "At least one base package must be specified"); // 使用Set可以去重,BeanDefinitionHolder对象已实现equals与hashCode方法
itliusir
2018/12/07
3010
Spring解密 - Bean 加载流程
在 Spring解密 - XML解析 与 Bean注册 中,讲了 Bean的解析,本章将详细讲解 Spring中Bean的加载过程,相比 解析而言,加载稍微复杂一点.
battcn
2018/08/03
1.1K0
一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。
通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring IOC的初始化工作已经完成,这篇文章主要对Bean的加载进行一个深入的了解及探索。
@派大星
2023/06/28
2080
一文带你解读Spring5源码解析 IOC之开启Bean的加载,以及FactoryBean和BeanFactory的区别。
Spring学习(一)bean的初始化过程
(1)通过@ComponentScan扫描com.ywl.leetcode下面所有的类。
虞大大
2020/08/26
2.6K0
Spring学习(一)bean的初始化过程
Spring源码学习笔记(2)——Bean的加载
Spring源码学习笔记(2)——Bean的加载 一. Bean加载的核心流程 前面大概分析了Spring读取解析配置文件,并加载BeanDefinition的过程。本节详细整理下Bean的加载过程。首先贴上核心代码 protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly)
张申傲
2020/09/03
3000
深度解析 Spring Bean 的加载
这个方法首先从缓存中去获取,这个时候缓存中当然没有数据,因为此时是初始化,我们还没有将bean方到singletonObjects这个map中去,如下图代码。
用户1516716
2019/08/23
3750
Spring5 源码学习 (9) doGetBean 概述
接上回,AbstractApplicationContext#refresh调用AbstractApplicationContext#finishBeanFactoryInitialization来初始化所有的非懒加载单例 Bean。在该AbstractApplicationContext#finishBeanFactoryInitialization方法内部通过调用AbstractBeanFactory#doGetBean来获取 Spring 容器所管理的 Bean。
Coder小黑
2019/12/18
4240
Spring5源码解析-IOC之Scope作用域 一文让你了解bean的作用域scope的底层实现
我们都知道在Spring中配置Bean的时候有一个属性scope,它默认是singleton,还有prototype、request等其它的scope,之前的文章有了解关于singleton的大致的流程,那么其它的步骤是怎么样的呢?接下来我们进行一下简单的梳理:
@派大星
2023/06/28
1810
Spring5源码解析-IOC之Scope作用域  一文让你了解bean的作用域scope的底层实现
手撕spring bean的生命周期
org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String, java.lang.Class)
程序员小强
2019/11/04
4770
逐行阅读Spring5.X源码(四) BeanFactory——核心容器bean工厂
5.DefaultSingletonBeanRegistry。SingletionBean注册器的默认实现,同时继承SimpleAliasRegistry。因此这个类可以有别名注册的功能和单例bean注册的功能,并且他还支持注册DisposableBean实例;它依赖ObjectFactory接口和DisposableBean接口(关闭注册表时调用到了destroy方法)。侧重于Bean的注册,销毁,以及依赖关系(关联关系)的注册和销毁。
源码之路
2020/09/04
1.3K0
逐行阅读Spring5.X源码(四) BeanFactory——核心容器bean工厂
Spring源码解析FactoryBean
FactoryBean是怎么让Spring容器管理调用它的getObject所生成的Bean的。 从getBean方法开始说起。 场景:
JavaEdge
2021/02/22
4830
Spring源码解析FactoryBean
【小家Spring】Spring的单例Bean定注册中心SingletonBeanRegistry详解
上一篇重点介绍了bean定义信息的注册: 【小家Spring】Spring的Bean定义注册中心BeanDefinitionRegistry详解
YourBatman
2019/09/03
1K0
【小家Spring】Spring的单例Bean定注册中心SingletonBeanRegistry详解
Spring系列三之Bean实例化流程
紧接着上文,Spring的Bean实例化发生在刷新IOC容器阶段的倒数第二步finishBeanFactoryInitialization(beanFactory),最终在该方法中调用DefaultListable.preInstantiateSingletons()方法实例化所有非懒加载的Bean实例,代码如下
用户9511949
2024/09/05
1580
推荐阅读
相关推荐
【死磕 Spring】----- IOC 之从单例缓存中获取单例 bean
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文