spring4.3.6源代码 - beans - bean的创建、销毁、BeanPostProcessor

37 篇文章 0 订阅
21 篇文章 0 订阅

知识点

钩子:aop就是使用钩子实现
依赖注入(自动装配Autowire):autowire="byName"
Aware依赖注入: BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 接口
CGLIB:生成子类,用于支持 <lookup-method name="" bean="" />、<replaced-method name="" replacer="" />
afterPropertiesSet:在调用初始化方法前会调用本方法
初始化方法:init-method=""

 

继承树:
	org.springframework.beans.factory.config.BeanPostProcessor
		-org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor
		-org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
			-org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor

种类:
	org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 实例化前后
 	org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor 决策构造函数
 	org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor 合并 BeanDefinition
 	org.springframework.beans.factory.config.BeanPostProcessor 调用初始化方法前后

创建 - 伪代码



createBean(beanName, mbd, args)
{
	1、Object bean = resolveBeforeInstantiation(beanName, mbdToUse)
	{
		1、-> 调用实现InstantiationAwareBeanPostProcessor接口的hooker的postProcessBeforeInstantiation方法,创建并返回实例
		2、-> 调用实现BeanPostProcessor接口的hooker的postProcessAfterInitialization方法
	}
	if (bean != null) { // 如果不为null,直接返回
		return bean;
	}

	2、Object beanInstance = doCreateBean(beanName, mbdToUse, args)
	{
		1、instanceWrapper = createBeanInstance(beanName, mbd, args) // 创建实例(可能使用构造函数装配依赖)
		{
			1、createBeanInstance 
			-> 调用实现SmartInstantiationAwareBeanPostProcessor接口的hooker的determineCandidateConstructors方法,识别构造函数,并创建实例
			使用无参构造函数创建实例 (会尝试使用autowireConstructor装配)
		}
		
		
		2、-> 调用实现MergedBeanDefinitionPostProcessor接口的hooker的postProcessMergedBeanDefinition方法

		3、populateBean(beanName, mbd, instanceWrapper) // 填充bean(使用属性名or参数类型装配依赖)
		{
			-> 调用实现InstantiationAwareBeanPostProcessor接口的hooker的postProcessAfterInstantiation方法
			设置属性,支持的装配模式有 autowireByName 或者 autowireByType
			-> 调用实现InstantiationAwareBeanPostProcessor接口的hooker的postProcessPropertyValues方法
		}
			

		4、exposedObject = initializeBean(beanName, exposedObject, mbd)
		{
			如果bean实现BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 接口,给bean注入依赖
			-> 调用实现BeanPostProcessor接口的hooker的postProcessBeforeInitialization方法
			如果bean实现了InitializingBean接口,那么调用afterPropertiesSet方法
			调用bean的init-method配置的方法
			-> 调用实现BeanPostProcessor接口的hooker的postProcessAfterInitialization方法
		}
			

		5、registerDisposableBeanIfNecessary(beanName, bean, mbd) // 注册bean的销毁适配器DisposableBeanAdapter,用于调用 destroy-method=""
		{
			// ....

		}
	}
}


 

销毁 - 伪代码

org.springframework.context.support.AbstractApplicationContext#close
{
	// ...
	org.springframework.context.support.AbstractApplicationContext#destroyBeans
	{
		// ...
		org.springframework.beans.factory.support.DefaultListableBeanFactory#destroySingletons
		{
			// ...

			String[] disposableBeanNames;
			synchronized (this.disposableBeans) {
				disposableBeanNames = StringUtils.toStringArray(this.disposableBeans.keySet());
			}
			for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
				// 调用DisposableBeanAdapter的destroy方法(DisposableBeanAdapter适配bean的destroy-method=""方法)
				destroySingleton(disposableBeanNames[i]); 
				{
					// ...
					// 调用DisposableBeanAdapter的destroy方法(DisposableBeanAdapter适配bean的destroy-method=""方法)
					// org.springframework.beans.factory.support.DisposableBeanAdapter#destroy
					bean.destroy(); 
					{
						if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
							for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) { // ---- hook
								processor.postProcessBeforeDestruction(this.bean, this.beanName);
							}
						}

						// 调用目标方法
						if (this.destroyMethod != null) {
							invokeCustomDestroyMethod(this.destroyMethod);
						}
						else if (this.destroyMethodName != null) {
							Method methodToCall = determineDestroyMethod();
							if (methodToCall != null) {
								invokeCustomDestroyMethod(methodToCall);
							}
						}

					}
					// ...
				}

			}
			// ...

		}
		// ...

	}
	// ...
}

 

 创建 - 代码片段

实例化bean(实例化方式有多种) --->  设置bean的属性(设置方法有多种)  ---> 识别感知接口进行注入(调用接口方法一种)  ---> 调用初始化方法(初始化方法有多种)
		
----------------------

继承树:
	org.springframework.beans.factory.config.BeanPostProcessor
		-org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor
		-org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
			-org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor

种类:
	org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 实例化前后
 	org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor 决策构造函数
 	org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor 合并 BeanDefinition
 	org.springframework.beans.factory.config.BeanPostProcessor 调用初始化方法前后
 	
埋点信息:(不是扩展硬编码合成(!mbd.isSynthetic())的bean才会应用 BeanPostProcessors)
	// org.springframework.beans.factory.support.DefaultListableBeanFactory
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(String name, Class<T> requiredType)
	{
		org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(String name, Class<T> requiredType, Object[] args, boolean typeCheckOnly)
		{
			org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String beanName, RootBeanDefinition mbd, Object[] args)
			{
				org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(beanClass, beanName); // --埋点-- 实例化前(钩子)
				Object beanInstance = org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(beanName, mbdToUse, args);
				{
					// --- createBeanInstance --- bof --- 
					instanceWrapper = org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(beanName, mbd, args); // 实例化对象
					{
						if (mbd.getFactoryMethodName() != null)  { // 工厂方法名
							return org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(beanName, mbd, args);  // 使用工厂创建
						}
						
						// Need to determine the constructor... 自动感知出构造函数
						Constructor<?>[] ctors = org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
						{
							org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors(beanClass, beanName);// --埋点-- 决策构造函数(钩子)
						}
						if (ctors != null ||
								mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR || “自动装配” --- 感知“构造函数”,注入依赖的bean对象
								mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  { // 有配置“构造函数”的信息,有提供构造函数参数
							return org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(beanName, mbd, ctors, args);
						}
				
						// No special handling: simply use no-arg constructor. 使用无参构造函数实例化bean
						return org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(beanName, mbd);
						{
							// 实例化对象, org.springframework.beans.factory.support.CglibSubclassingInstantiationStrategy.instantiate(mbd, beanName, parent);
							beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
							BeanWrapper bw = new BeanWrapperImpl(beanInstance);
							initBeanWrapper(bw);
							return bw;
						}
					}
					// --- createBeanInstance --- eof --- 
					 
					final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null); // 实例化对象
					
					org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(mbd, beanType, beanName); // --埋点-- 合并 BeanDefinition(钩子)
					
					// --- populateBean --- bof --- 
					Object exposedObject = bean;  // 实例对象
					org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(beanName, mbd, instanceWrapper); // 填充属性
					{
						PropertyValues pvs = mbd.getPropertyValues(); // xml配置的属性值
						
						if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { // 有hook
							for (BeanPostProcessor bp : getBeanPostProcessors()) {
								if (bp instanceof InstantiationAwareBeanPostProcessor) {
									InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
									if (!org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { // --埋点-- 实例化后(钩子)
										continueWithPropertyPopulation = false;
										break;
									}
								}
							}
						}
						
						// 自动装配 --- 依赖注入
						if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
								mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { // “自动装配”类型
							MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
			
							// Add property values based on autowire by name if applicable.
							if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { // “自动装配” --- 感知setter方法的“属性名”,注入依赖的bean对象
								autowireByName(beanName, mbd, bw, newPvs);
								{
									String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); // 不在xml文件的属性、不是简单类型
									for (String propertyName : propertyNames) {
										if (containsBean(propertyName)) { // 存在bean
											Object bean = getBean(propertyName);
											newPvs.add(propertyName, bean);
											registerDependentBean(propertyName, beanName); // 注册依赖关系
										}
										else {
										}
									}
								}
							}
			
							// Add property values based on autowire by type if applicable.
							if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { // “自动装配” --- 感知setter方法的“参数类型”,注入依赖的bean对象 !!!
								autowireByType(beanName, mbd, bw, newPvs); // org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(...)
								{
									String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); // bean对象的属性列表
									for (String propertyName : propertyNames) {
									PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName); // 某个属性的信息
									if (Object.class != pd.getPropertyType()) { // 属性的类型
										MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd); // setter的参数信息
										// Do not allow eager init for type matching in case of a prioritized post-processor.
										boolean eager = !PriorityOrdered.class.isAssignableFrom(bw.getWrappedClass()); // bean对象不继承自PriorityOrdered,就是饥渴模式
										DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
										Object autowiredArgument = DefaultListableBeanFactory.resolveDependency(descriptor === desc, beanName, autowiredBeanNames, converter); // !!! 解析参数类型--- org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(...)
										{
											if (javaUtilOptionalClass == descriptor.getDependencyType()) {// !!! 参数类型是 Optional
												return new OptionalDependencyFactory().createOptionalDependency(descriptor, requestingBeanName); // 返回bean实例
											}
											else if (ObjectFactory.class == descriptor.getDependencyType() || // !!! 参数类型是 ObjectFactory
													ObjectProvider.class == descriptor.getDependencyType()) { // !!! 参数类型是 ObjectProvider
												return new DependencyObjectProvider(descriptor, requestingBeanName);
											}
											else if (javaxInjectProviderClass == descriptor.getDependencyType()) {  // !!! 参数类型 javax.inject.Provider
												return new Jsr330ProviderFactory().createDependencyProvider(descriptor, requestingBeanName);
											}
											else { // 其他参数类型
												Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(
														descriptor, requestingBeanName); // org.springframework.beans.factory.support.SimpleAutowireCandidateResolver
												if (result == null) {
													result = DefaultListableBeanFactory.doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);// !!!
													{
														...
														Class<?> type = descriptor.getDependencyType(); // 方法参数类型,如: Optional、Bean1、
														Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor); //推荐值 org.springframework.beans.factory.support.SimpleAutowireCandidateResolver
														if (value != null) { // value === null
														}
														
														Object multipleBeans = DefaultListableBeanFactory.resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter); // 参数类型是 Array/Collection/Map
														if (multipleBeans != null) { // multipleBeans === null
															return multipleBeans;
														}
														
														// !!!!!  --- 根据autowire-candidate="true"配置选择“参与自动装配的bean”列表   0、根据setter方法上配置的注解是否在<qualifier>标签中声明进行选择(默认不支持 - 要自行扩展,详见 CustomAutowireConfigurer)
														Map<String, Object> matchingBeans = DefaultListableBeanFactory.findAutowireCandidates(beanName, type, descriptor); // “成为自动装配候选人”的列表
														{
															String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType, true, descriptor.isEager()); // 根据bean的类型获取符合条件的bean列表
														}
														
														if (matchingBeans.isEmpty()) {
															if (descriptor.isRequired()) { // 必须
																raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);// !!!!
																{
																	checkBeanNotOfRequiredType(type, descriptor); //!!!
																	{
																		for (String beanName : this.beanDefinitionNames) {
																			Class<?> beanType = (beanInstance != null ? beanInstance.getClass() : predictBeanType(beanName, mbd)); // !!! predictBeanType
																			{
																				Class<?> predicted = org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor.predictBeanType(targetType, beanName); //  --埋点--  predictBeanType调用(钩子)                                             
																				if (predicted != null && (typesToMatch.length != 1 || FactoryBean.class != typesToMatch[0] ||
																						FactoryBean.class.isAssignableFrom(predicted))) {
																					return predicted;
																				}
																			}
																		}
																	}
																}
															}
															return null;
														}
														...
														if (matchingBeans.size() > 1) { // 根据类型匹配到的bean超过一个
															autowiredBeanName = DefaultListableBeanFactory.determineAutowireCandidate(matchingBeans, descriptor); // 选择规则是:1、检查有配置primary的bean ; 2、根据bean优先权order(默认不支持 - 要自行扩展)   3、根据参数名获取到bean(默认不支持 - 要自行扩展)
															{
																Class<?> requiredType = descriptor.getDependencyType();
																String primaryCandidate = determinePrimaryCandidate(candidates, requiredType); // 检查有配置primary的bean
																if (primaryCandidate != null) {
																	return primaryCandidate;
																}
																String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType); // 根据优先权order获取bean
																if (priorityCandidate != null) {
																	return priorityCandidate;
																}
																// Fallback
																for (Map.Entry<String, Object> entry : candidates.entrySet()) {
																	String candidateName = entry.getKey();
																	Object beanInstance = entry.getValue();
																	if ((beanInstance != null && this.resolvableDependencies.containsValue(beanInstance)) ||
																			matchesBeanName(candidateName, descriptor.getDependencyName())) { // 根据参数名进行匹配bean
																		// descriptor.getDependencyName() --- 始终返回null  --- AutowireByTypeDependencyDescriptor.getDependencyName()
																		return candidateName;
																	}
																}
																return null;
															}
															instanceCandidate = matchingBeans.get(autowiredBeanName);
														}
														...
														return (instanceCandidate instanceof Class ?  // 如果instanceCandidate实现了 Class接口
																	descriptor.resolveCandidate(autowiredBeanName, type, this) : instanceCandidate); // !!!!
													}
												}
												return result;
											}
										
										}
										if (autowiredArgument != null) {
											pvs.add(propertyName, autowiredArgument);
										}
									}
								}
							}
			
							pvs = newPvs;
						}
						
						org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName); // --埋点-- 属性依赖识别完成(钩子)
					
						org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(beanName, mbd, bw, pvs); // 设置属性值  bw === org.springframework.beans.BeanWrapperImpl
						{
							BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);
							for (PropertyValue pv : original) { // 属性列表
								String propertyName = pv.getName(); // 属性名
								Object originalValue = pv.getValue(); // 属性值
								// org.springframework.beans.factory.support.BeanDefinitionValueResolver
								Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue); // 解析依赖值
								{
									// value === originalValue
									if (value instanceof RuntimeBeanReference) { // 是运行时引用,获取bean对象
										RuntimeBeanReference ref = (RuntimeBeanReference) value;
										return resolveReference(argName, ref);
									}
									else if (value instanceof RuntimeBeanNameReference) {
										String refName = ((RuntimeBeanNameReference) value).getBeanName();
										refName = String.valueOf(doEvaluate(refName));
										if (!this.beanFactory.containsBean(refName)) { // 不存在bean名称就出错
											throw new BeanDefinitionStoreException(
													"Invalid bean name '" + refName + "' in bean reference for " + argName);
										}
										return refName;
									}
									else if (value instanceof BeanDefinitionHolder) {
										// Resolve BeanDefinitionHolder: contains BeanDefinition with name and aliases.
										BeanDefinitionHolder bdHolder = (BeanDefinitionHolder) value;
										return resolveInnerBean(argName, bdHolder.getBeanName(), bdHolder.getBeanDefinition());
									}
									else if (value instanceof BeanDefinition) {
										// Resolve plain BeanDefinition, without contained name: use dummy name.
										BeanDefinition bd = (BeanDefinition) value;
										String innerBeanName = "(inner bean)" + BeanFactoryUtils.GENERATED_BEAN_NAME_SEPARATOR +
												ObjectUtils.getIdentityHexString(bd);
										return resolveInnerBean(argName, innerBeanName, bd);
									}
									else if (value instanceof ManagedArray) {
									}
									else if (value instanceof ManagedList) {
									}
									else if (value instanceof ManagedSet) {
									}
									else if (value instanceof ManagedMap) {
									}
									else if (value instanceof ManagedProperties) {
									}
									else if (value instanceof TypedStringValue) {
									}
									else {
										return evaluate(value);
										{
											if (value instanceof String) {
												return doEvaluate((String) value);
												{
													// org.springframework.beans.factory.support.DefaultListableBeanFactory.evaluateBeanDefinitionString(value, this.beanDefinition);
													return this.beanFactory.evaluateBeanDefinitionString(value, this.beanDefinition);
													{
														// beanExpressionResolver === org.springframework.context.expression.StandardBeanExpressionResolver
														if (this.beanExpressionResolver == null) { 
															return value;
														}
														Scope scope = (beanDefinition != null ? getRegisteredScope(beanDefinition.getScope()) : null);
														return this.beanExpressionResolver.evaluate(value, new BeanExpressionContext(this, scope));
													}
												}
											}
											else if (value instanceof String[]) {
												String[] values = (String[]) value;
												boolean actuallyResolved = false;
												Object[] resolvedValues = new Object[values.length];
												for (int i = 0; i < values.length; i++) {
													String originalValue = values[i];
													Object resolvedValue = doEvaluate(originalValue);
													if (resolvedValue != originalValue) {
														actuallyResolved = true;
													}
													resolvedValues[i] = resolvedValue;
												}
												return (actuallyResolved ? resolvedValues : values);
											}
											else {
												return value;
											}
										}
									}
								}
								Object convertedValue = resolvedValue;
								boolean convertible = bw.isWritableProperty(propertyName) &&
										!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
								if (convertible) {
									convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter); // !!!类型转换
								}
								if (resolvedValue == originalValue) {
									if (convertible) {
										pv.setConvertedValue(convertedValue);
									}
									deepCopy.add(pv);
								}
								else if (convertible && originalValue instanceof TypedStringValue &&
										!((TypedStringValue) originalValue).isDynamic() &&
										!(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
									pv.setConvertedValue(convertedValue);
									deepCopy.add(pv);
								}
								else {
									resolveNecessary = true;
									deepCopy.add(new PropertyValue(pv, convertedValue));
								}
							}
							bw.setPropertyValues(new MutablePropertyValues(deepCopy)); // 设置值
						}
					}
					// --- populateBean --- eof --- 
					 
					// --- initializeBean --- bof ---  
					exposedObject = org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(beanName, exposedObject, mbd); // 注入感知对象、调用初始化方法
					{
						invokeAwareMethods(beanName, bean); // 给bean对注入感知对象
						{
							if (bean instanceof Aware) {
								if (bean instanceof BeanNameAware) {
									((BeanNameAware) bean).setBeanName(beanName); // 调用感知方法
								}
								if (bean instanceof BeanClassLoaderAware) {
									((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
								}
								if (bean instanceof BeanFactoryAware) {
									((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
								}
							}
						}
						
						org.springframework.beans.factory.config.BeanPostProcessor.postProcessBeforeInitialization(result, beanName); // --埋点--  初始化前(钩子)
					
						invokeInitMethods(beanName, wrappedBean, mbd); // 调用bean的初始化方法
						{
							if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) { // bean实现了InitializingBean接口
								((InitializingBean) bean).afterPropertiesSet(); // 调用afterPropertiesSet()方法
							}
							if (mbd != null) {
								String initMethodName = mbd.getInitMethodName();
								if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
										!mbd.isExternallyManagedInitMethod(initMethodName)) {
									invokeCustomInitMethod(beanName, bean, mbd); // 调用init-method="xxx"配置的初始化方法
								}
							}
						}
						
						org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization(result, beanName); // --埋点--  初始化后(钩子),aop在这边做的代理劫持
					}
					// --- initializeBean --- bof ---  
					 
					if (earlySingletonExposure) {
						Object earlySingletonReference = getSingleton(beanName, false);
						{
							return org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference(exposedObject, beanName); // --埋点--  EarlyBean引用(钩子)
						}
					}
					
					return exposedObject;
				}
				return beanInstance;
			}
		}
	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值