spring容器是什么

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等组件
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值