Spring源码解析9细说Aop

1.>今天我们讲下Spring中的自动装配以及如何通过构造方法实例化的对象
上次我也讲了 什么时候执行我们的BeanPostProcessor ,并且令后置处理器完成了Aop的功能,
今天我们来细说
beanFactory.preInstantiateSingletons(); 这个方法
我们一个Bean到底是如何实例化构造出来的
首先第一步
List beanNames = new ArrayList<>(this.beanDefinitionNames);
我们拿出来需要初始化的类
然后判断我们这个类是不是单利的以及是不是Lazy
此时我们这个类是单利的并且不是懒加载
// 然后一直点击进来 doGetBean
final String beanName = transformedBeanName(name);
这里是处理& 也就
然后我们调用一个
Object sharedInstance = getSingleton(beanName);
getSingleton()//----------->我们现在在初始化-------
在初始化的过程调用getSingleton() //此时100%为空 为什么 以后再说
此时这个SingletonObjects就是我们的Ioc容器

Object singletonObject = this.singletonObjects.get(beanName);//获取我们的Bean
也就是说Spring的ioc容器从宏观上讲是Spring整个环境 包括他的bean工厂 Spring内部的后置处理器
以及Spring读取器
从微观上说就是这个singletonObjects 线程安全的容器
这是个if()else{}
//-----Spring在完成初始化的时候先那一边 看有没有 如果没有的话再去实例化
isPrototypeCurrentlyInCreation(beanName然后这个方法是判断一个类是不是圆型 ,如果是原型的话就会报错
然后就是 markBeanAsCreated(beanName);
这个方法的作用就是this.alreadyCreated.add(beanName);
吧beanName加入到这个集合中,表示这个类正在被创建的过程中 防止重复创建
他这个方法我也没研究过 就是说检查…吧
在这里插入图片描述
checkMergedBeanDefinition(mbd, beanName, args); 这个也是检查
然后再继续看我们这个类有没有依赖
-------------------------经过一系列的检查后
在这里插入图片描述
经过一系列的检查后Spring又会调用一次getSingleton()//------->不一样
Object singletonObject = this.singletonObjects.get(beanName);
此时Ioc容器中没有bean 然后创建
//-------------> 这里有一个这行代码
beforeSingletonCreation(beanName);
在这里插入图片描述

点进去看就是在singletonsCurrentlyInCreation 这个集合中添加这个beanName

======================================================
这里大致讲一下Spring在doGetBean()的逻辑
Spring首先会调用一次 getSingleton(beanName);
如果有返回值的话 Spring直接就return了 没有的话经过一系列的检查然后再 beforeSingletonCreation(beanName); 此时才创建
------------------我们看下2个getSing()的逻辑

第一个getSingleton
	@Nullable
	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		// 从map中 获取Bean如果不为空直接返回,不再进行初始化操作,
		//isSingletonCurrentlyInCreation---》set是否包含
			Object singletonObject = this.singletonObjects.get(beanName);  //null
		//isSingletonCurrentlyInCreation(beanName)  不成立  spring在此时还不认为自动创建
		// 正在被创建  就会执行下列代码 第一次调用getSingle()
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}
第二个getSingleton
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "Bean name must not be null");
		synchronized (this.singletonObjects) {
			//Spring ioc 容器开始创建
			Object singletonObject = this.singletonObjects.get(beanName);
			if (singletonObject == null) {
				if (this.singletonsCurrentlyInDestruction) {
					throw new BeanCreationNotAllowedException(beanName,
							"Singleton bean creation not allowed while singletons of this factory are in destruction " +
							"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
				}
				//将BeanName放入singletonsCurrentlyInCreation 表示BeanName对应的Bean正在被创建中
				beforeSingletonCreation(beanName);

//--------第一个getSingleton()中
singletonObject == null && isSingletonCurrentlyInCreation(beanName)
如果singletonObject 是空并且this.singletonsCurrentlyInCreation.contains(beanName)这个容器中包括BeanName的时候
才走之后的逻辑 因为第一次肯定为singletonObject 肯定为空 但是 isSingletonCurrentlyInCreation 不包括beanName
--------------------------->然后经过系列的check
再走下面的getSingleton 此时如果singletonObject 为空的话 就创建
并且把
//将BeanName放入singletonsCurrentlyInCreation 表示BeanName对应的Bean正在被创建中
也就是说
第一次调用getSingle() //—>null 因为Spring此时认为还没有到需要创建的时候,所以这个 getSinle() 直接返回一个Null
第二次getSingle()//—>Object 因为Spring 已经做了验证 如果都成立 则调用 getSingle()//-> 创建
呢么第一次getSingle()s是在什么时候有用呢 我们app.getBean()// 会最终调用到这个getSingle() //方法
[可以在此处打个断点 app.getBean()// 会运行到这里了]
2次getSingle调用的时机不一样 第一次是app,getBean()//的时候
如果有值得话直接return
第二次是创建的时候 经过各种验证 最终创建
----------------------------------------------------------------------------------------------------------------------------->
singletonObject = singletonFactory.getObject();// 然后调用这个方法去创建对象
-------------------->复杂的lambda我也不是很懂
在这里插入图片描述
然后看这个方法createBean
mbdToUse.prepareMethodOverrides();
此处的MethodOverrides
// 处理lookup method 和replace-method 配置 spring 将2个配置统称为Overrides
然后调用这个方法
//------> Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
//------>看注释可以说明 这个方法是返回一个Bean 也是通过后置处理器实现的
这个方法点进去在这里插入图片描述
这里返回一个广义的Bean 如果我们仅仅只是想把他new 出来 吧一个对象的所有依赖关系都给去掉 这个对象当中所有的依赖都不会维护
在这里插入图片描述
也就是我们一个类如果实现了他 就可以选择性的返回一个广义的bean 【没有任何依赖的】
///------------------------------------>
然后就到了我们这个方法 返回Bean实例的方法
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
···----------------->这个方法里面这里
instanceWrapper = createBeanInstance(beanName, mbd, args);
返回我们的BeanWrapper 对象 以及这个我们Bean的实例化
createBeanInstance
这个方法里面
1.>
mbd.getFactoryMethodName() != null//—
何为FactoryMethodName 就是说我们xml中配置的

<bean id  class  factorymethod>

在这里插入图片描述
然后重点看这里这个方法告诉我们Spring在创建对象的时候该使用无参构造以及有参构造 或者说是哪个构造方法 来创建对象

--------------------->可能以后写的不是很好 但是我也会努力的去写 因为Spring越往后越难

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值