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

Spring Bean的加载

作者头像
WindWant
发布2020-09-11 10:57:42
3650
发布2020-09-11 10:57:42
举报
文章被收录于专栏:后端码事

一、Spring加载bean的原则

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

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

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

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

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

代码语言:javascript
复制
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
复制
<bean id="book" class="com.xxx.model.BookFactory"/>

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

代码语言:javascript
复制
Book book = ctx.getBean("book");

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

代码语言:javascript
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Spring加载bean的原则
  • 二、工厂方法配置bean
  • 三、单例Bean(singleton)获取
  • 四、Bean创建
  • 五、Bean初始化
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档