spring容器是什么,首先在官方文档中,有对于spring容器的说明,

The org.springframework.context.ApplicationContext interface represents the Spring IoC container and is responsible for instantiating, configuring, and assembling the beans. The container gets its instructions on what objects to instantiate, configure, and assemble by reading configuration metadata. The configuration metadata is represented in XML, Java annotations, or Java code. It lets you express the objects that compose your application and the rich interdependencies between those objects.
大致的意思就是:applicationContext代表了springIOC容器,并且负责实例化、配置和组装bean;

我说下我自己的观点:我认为,这个问题要从两方面来说吧
如果是单纯的从狭义上去理解,spring容器就是源码中的一个map集合:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonObjects
这是从狭义的角度来说的
那如果从广义上来说,spring容器除了这个map集合之外,还有N多个后置处理器、beanFactoryPostProcessor、applicationContext等组件,因为这些组件,共同完成了bean的扫描、初始化、实例化、属性注入等

源码

//从单实例池中查询beanName对应的实例化好的对象
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {if (logger.isDebugEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.debug("Returning cached instance of singleton bean '" + beanName + "'");}}/*** 如果获取到的bean是factoryBean类型的(比如:mybatis的mapper接口就是MapperFactoryBean类型的),就会在下面这行代码中,调用* factoryBean的getObject()方法,完成代理对象的生成或者一些业务逻辑的处理*/bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {synchronized (this.singletonObjects) {//mpy 这里只需要从二级缓存中拿一次就行,如果没有二级缓存,每次进来都需要从二级缓存get一次,影响效率singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {/*** 这里getObject会调用getEarlyBeanReference(beanName, mbd, bean)方法,完成动态代理对象的生成* 这里为什么要调用这个方法?* 我的理解是这样的:在属性注入之后,还有两个后置处理器需要调用:*     1.applyBeanPostProcessorsBeforeInitialization   invokeInitMethod方法,也即:调用bean的初始化方法的后置处理器*     2.applyBeanPostProcessorsAfterInitialization  这里完成的是:代理对象的生成(比如:AOP动态代理对象生成,事务方法代理对象生成)** 既然有了循环依赖,总要有一个bean是要先注入的,在注入*/singletonObject = singletonFactory.getObject();this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}return singletonObject;
}

第一个方法,比较简单,就是从第二个方法中,返回一个Object对象,如果object对象,不为null,就判断是否是factoryBean对象,如果是,就调用getObject方法获取对应的代理对象

第二个方法:
这个方法返回的有可能是从singletonObjects中取出来的已经实例化好的对象
也有可能返回的是singletonFactory.getObject();得到的半成品对象(这里的意思是并没有完成的走完spring的初始化流程),这个所谓的半成品的bean,在前面循环依赖里面,我有说到,在实例化完成之后,会把实例化好的bean放入到singletonObjects中

但是,这个方法只是获取bean的一个操作,真正对bean的初始化、实例化、属性注入等操作,是在N多个后置处理器中完成的

所以:如果说spring容器的存储功能,我觉得就是指singletonObject这个对象,因为所说的spring容器,最终就是用来存储spring帮程序员实例化好的这些对象的,所以这里就看各位怎么看了,总之,我的结论是这样的:

  1. 狭义上讲,spring容器就是指singletonObjets这个map集合对象
  2. 广义上讲,那spring容器就是applicationContext、beanFactoryPostProcessor、beanPostProcess等组件

spring容器是什么相关推荐

  1. 使用Spring容器

    1.BeanFactory BeanFactory可视为Spring的BeanFactory容器,它的主要功能是为依赖注入(Dependency Injection,DI)提供支持.这个容器接口在or ...

  2. 将Bean放入Spring容器中的五种方式

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/weixin_43741092/ article/details/120176466 将bean放 ...

  3. Spring 容器的启动过程

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 本文来源:http://r6f.cn/b47K 一. 前言 ...

  4. Spring容器和Bean加载

    Spring容器的IOC和DI概念 IOC(控制反转):对于组件的控制权进行了转移,传统的程序设计是由客户端new出对象,是程序主动创建所依赖的对象.而IOC是专门将对象的创建交给容器处理,组件的控制 ...

  5. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

    经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...

  6. SpringBoot 之 普通类获取Spring容器中的bean

    SpringBoot 之 普通类获取Spring容器中的bean 转载于:https://www.cnblogs.com/lwmp/p/8892927.html

  7. Servlet自动注入Spring容器中的Bean解决方法

    Servlet自动注入Spring容器中的Bean解决方法 参考文章: (1)Servlet自动注入Spring容器中的Bean解决方法 (2)https://www.cnblogs.com/jank ...

  8. Spring Boot中普通类获取Spring容器中的Bean

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,自己动手n ...

  9. Spring 容器AOP的实现原理——动态代理

    本文来自极客学院 Spring 容器AOP的实现原理--动态代理 之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大 ...

  10. Spring 容器IOC解析及简单实现

    这篇文章来自极客学院 : Spring 容器IOC解析及简单实现 最近一段时间,"容器"两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交 ...

最新文章

  1. flask管理不同的路由
  2. 【Android 界面效果9】9patch图片
  3. python logging模块写入中文,文件乱码的解决方法
  4. 李国庆离开当当,广东消委会告长隆,智能校服提供定位功能,全球首个5G火车站来了,这就是今天的大新闻...
  5. java并发练习之快乐影院
  6. threejs渲染器剔除模式
  7. python 数据分析-读写数据csv、xlsx文件
  8. 学生时代的神操作,你了解吗?
  9. 为什么要学习Linux操作系统?
  10. SSM框架之Spring MVC(四)异常处理和拦截器实现
  11. 根据一张表更新另一张表
  12. 深入解读Linux进程调度系列(5)——调度的入口
  13. B - I Hate It(单点更新)(区间求最大值)
  14. 3.abp框架code first方式创建表
  15. STM32智能小车第二章 PWM调速
  16. 微醺时代的白酒新锐:政策“理想”与现实“骨感”的夹缝进击
  17. 几分钟搞定,文件名称中文转英文
  18. 喂喂,说好的节操呢!
  19. android相机预览拍照功能实现
  20. mysql经典问题之group by和max函数

热门文章

  1. 短视频热点实时分享|想上热门你不能不知道的事
  2. 店铺详情怎么写?拓嘉辰丰告诉你方法
  3. Vue3 学习笔记 —— 破坏式更新、自定义指令 directive
  4. 万事皆显出自发偶然之态,但自有其规律-《爆发·大数据时代预见未来的新思维》笔记与心得
  5. ios苹果手机position:fixed的兼容性以及无法定位到全局的问题
  6. AppCompat发布两年了,还没了解?
  7. LaTeX技巧009:中国象棋的LaTeX排版
  8. linux系统做成服务器,使用Linux Deploy将手机做成Linux服务器
  9. Solaris9下MYSQL安装与维护
  10. MySql(一)SQL详解