Spring-创建bean

avatar
作者
猴君
阅读量:0

preInstantiateSingletons

v1.0 preInstantiateSingletons

tips:最终调用getBean使用的是RootBeanDefinition进行构建的

  	public void preInstantiateSingletons() throws BeansException { 		if (logger.isTraceEnabled()) { 			logger.trace("Pre-instantiating singletons in " + this); 		}  		//获取所有beanDefinition的名字 		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);  		//循环 		for (String beanName : beanNames) { 			// 获取合并后的BeanDefinition,看代码V1.1 			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); 			//如果RootBeanDefinition不是抽象BeanDefinition,是单例bean,非懒加载,则创建bean对象 			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { 				if (isFactoryBean(beanName)) { 					// 获取FactoryBean对象 					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); 					if (bean instanceof FactoryBean) { 						FactoryBean<?> factory = (FactoryBean<?>) bean; 						boolean isEagerInit; 						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { 							isEagerInit = AccessController.doPrivileged( 									(PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit, 									getAccessControlContext()); 						} 						else { 							isEagerInit = (factory instanceof SmartFactoryBean && 									((SmartFactoryBean<?>) factory).isEagerInit()); 						} 						if (isEagerInit) { 							// 创建真正的Bean对象(getObject()返回的对象) 							getBean(beanName); 						} 					} 				} 				else { 					// 创建Bean对象 					getBean(beanName); 				} 			} 		}  		// 所有的非懒加载单例Bean都创建完了后 		//找出实现了SmartInitializingSingleton接口的单例bean,并执行afterSingletonsInstantiated()方法 	 		for (String beanName : beanNames) { 			Object singletonInstance = getSingleton(beanName); 			if (singletonInstance instanceof SmartInitializingSingleton) { 				StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize") 						.tag("beanName", beanName); 				SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; 				if (System.getSecurityManager() != null) { 					AccessController.doPrivileged((PrivilegedAction<Object>) () -> { 						smartSingleton.afterSingletonsInstantiated(); 						return null; 					}, getAccessControlContext()); 				} 				else { 					smartSingleton.afterSingletonsInstantiated(); 				} 				smartInitialize.end(); 			} 		} 	}

什么是抽象BeanDefinition?

V1.1 getMergedLocalBeanDefinition

合并BeanDefinition

protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException { 		// 先从RootBeanDefinitionMap中获取当前beanName对应的RootBeanDefinition对象 		RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName); 		//如果已经存在,则直接返回 		if (mbd != null && !mbd.stale) { 			return mbd; 		} 		//如果不存在,则继续向下判断 		return getMergedBeanDefinition(beanName, getBeanDefinition(beanName)); 	} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 	protected RootBeanDefinition getMergedBeanDefinition( 			String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd) 			throws BeanDefinitionStoreException {  		synchronized (this.mergedBeanDefinitions) { 			RootBeanDefinition mbd = null; 			RootBeanDefinition previous = null;  			// Check with full lock now in order to enforce the same merged instance. 			if (containingBd == null) { 				mbd = this.mergedBeanDefinitions.get(beanName); 			}  			if (mbd == null || mbd.stale) { 				previous = mbd; 				//如果当前BeanDefinition没有父类 				if (bd.getParentName() == null) { 					//判断bd是否是RootBeanDefinition的实例,如果是,则克隆一个新的RootBeanDifinition对象 					if (bd instanceof RootBeanDefinition) { 						mbd = ((RootBeanDefinition) bd).cloneBeanDefinition(); 					} 					else { 						//直接创建一个RootBeanDefionition对象,并赋值 						mbd = new RootBeanDefinition(bd); 					} 				} 				else { 					//当bd存在父类的时候 					// pbd表示parentBeanDefinition 					BeanDefinition pbd; 					try { 						//获取父BeanDefinition的名称 						String parentBeanName = transformedBeanName(bd.getParentName()); 						//如果 当前bean的名称与父类名称不相同,表示父类还存在父类,则需要继续递归调用 						//最终的效果是每一个父类都已经合并完了,当前beanDefinition在和父类进行合并 						if (!beanName.equals(parentBeanName)) { 							pbd = getMergedBeanDefinition(parentBeanName); 						} 						else { 							BeanFactory parent = getParentBeanFactory(); 							if (parent instanceof ConfigurableBeanFactory) { 								pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName); 							} 							else { 								throw new NoSuchBeanDefinitionException(parentBeanName, 										"Parent name '" + parentBeanName + "' is equal to bean name '" + beanName + 												"': cannot be resolved without a ConfigurableBeanFactory parent"); 							} 						} 					} 					catch (NoSuchBeanDefinitionException ex) { 						throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName, 								"Could not resolve parent bean definition '" + bd.getParentName() + "'", ex); 					}  					// 子BeanDefinition的属性覆盖父BeanDefinition的属性,这就是合并 					//先用父类的BeanDefinition创建一个新的RootBeanDefinition 					mbd = new RootBeanDefinition(pbd); 					//在使用子类 的BeanDefinition覆盖RootBeanDefinition的属性 					mbd.overrideFrom(bd); 				}  				// 如果未设置bean的作用域,则默认设置未单例 				if (!StringUtils.hasLength(mbd.getScope())) { 					mbd.setScope(SCOPE_SINGLETON); 				}  				// A bean contained in a non-singleton bean cannot be a singleton itself. 				// Let's correct this on the fly here, since this might be the result of 				// parent-child merging for the outer bean, in which case the original inner bean 				// definition will not have inherited the merged outer bean's singleton status. 				if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) { 					mbd.setScope(containingBd.getScope()); 				}  				 				if (containingBd == null && isCacheBeanMetadata()) { 					this.mergedBeanDefinitions.put(beanName, mbd); 				} 			} 			if (previous != null) { 				copyRelevantMergedBeanDefinitionCaches(previous, mbd); 			} 			return mbd; 		}

doGetBean

protected <T> T doGetBean( 			String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) 			throws BeansException {  		// name有可能是 &xxx 或者 xxx,如果name是&xxx,那么beanName就是xxx 		// name有可能传入进来的是别名,那么beanName就是id 		//具体看v1.1 		String beanName = transformedBeanName(name); 		Object beanInstance;  		// 优先从单例池中获取beanDefinition 		Object sharedInstance = getSingleton(beanName);  		if (sharedInstance != null && args == null) { 			if (logger.isTraceEnabled()) { 				if (isSingletonCurrentlyInCreation(beanName)) { 					logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + 							"' that is not fully initialized yet - a consequence of a circular reference"); 				} 				else { 					logger.trace("Returning cached instance of singleton bean '" + beanName + "'"); 				} 			} 			// 如果sharedInstance是FactoryBean,那么就调用getObject()返回对象 			beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null); 		}  		else { 			// Fail if we're already creating this bean instance: 			// We're assumably within a circular reference. 			if (isPrototypeCurrentlyInCreation(beanName)) { 				throw new BeanCurrentlyInCreationException(beanName); 			}  			// Check if bean definition exists in this factory. 			BeanFactory parentBeanFactory = getParentBeanFactory(); 			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { 				//如果beanDefinitionMap的keys中不包含beanName,则调用父类的bean工厂创建创建对象 				String nameToLookup = originalBeanName(name); 				if (parentBeanFactory instanceof AbstractBeanFactory) { 					//此处是递归处理,直至找到beanDefginition 					return ((AbstractBeanFactory) parentBeanFactory).doGetBean( 							nameToLookup, requiredType, args, typeCheckOnly); 				} 				else if (args != null) { 					// Delegation to parent with explicit args. 					return (T) parentBeanFactory.getBean(nameToLookup, args); 				} 				else if (requiredType != null) { 					// No args -> delegate to standard getBean method. 					return parentBeanFactory.getBean(nameToLookup, requiredType); 				} 				else { 					return (T) parentBeanFactory.getBean(nameToLookup); 				} 			}  			if (!typeCheckOnly) { 				markBeanAsCreated(beanName); 			}  			StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate") 					.tag("beanName", name); 			try { 				if (requiredType != null) { 					beanCreation.tag("beanType", requiredType::toString); 				} 				//拿到beanName对应的RootBeanDefinition 				RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);  				// 检查BeanDefinition是不是Abstract的 				checkMergedBeanDefinition(mbd, beanName, args);  				// 找出这个对象所依赖的所有bean的集合,该字段于构建rootBeandefinition的时候赋值 				String[] dependsOn = mbd.getDependsOn(); 				if (dependsOn != null) { 					// dependsOn表示当前beanName所依赖的,当前Bean创建之前dependsOn所依赖的Bean必须已经创建好了 					for (String dep : dependsOn) { 						// beanName是不是被dep依赖了,如果是则出现了循环依赖 						//看代码v1.3 						if (isDependent(beanName, dep)) { 							throw new BeanCreationException(mbd.getResourceDescription(), beanName, 									"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); 						} 						// dep被beanName依赖了,存入dependentBeanMap中,dep为key,beanName为value 						registerDependentBean(dep, beanName);  						// 创建所依赖的bean 						try { 							getBean(dep); 						} 						catch (NoSuchBeanDefinitionException ex) { 							throw new BeanCreationException(mbd.getResourceDescription(), beanName, 									"'" + beanName + "' depends on missing bean '" + dep + "'", ex); 						} 					} 				}  				// bean是单例的情况 				if (mbd.isSingleton()) { 					//此处第二个参数lambda并不会马上执行,此处是相当于传入了一个对象, 					//该对象是getSingleton()方法中第二个参数接口的实例化,重写了该接口中唯一一个方法 					//具体看代码v1.2 					sharedInstance = getSingleton(beanName, () -> { 						try {                                 //见代码四 							return createBean(beanName, mbd, args); 						} 						catch (BeansException ex) { 							// Explicitly remove instance from singleton cache: It might have been put there 							// eagerly by the creation process, to allow for circular reference resolution. 							// Also remove any beans that received a temporary reference to the bean. 							destroySingleton(beanName); 							throw ex; 						} 					}); 					beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); 				} 				else if (mbd.isPrototype()) { 					// It's a prototype -> create a new instance. 					Object prototypeInstance = null; 					try { 						beforePrototypeCreation(beanName); 						prototypeInstance = createBean(beanName, mbd, args); 					} 					finally { 						afterPrototypeCreation(beanName); 					} 					beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); 				} 				else { 					String scopeName = mbd.getScope(); 					if (!StringUtils.hasLength(scopeName)) { 						throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'"); 					} 					Scope scope = this.scopes.get(scopeName); 					if (scope == null) { 						throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'"); 					} 					try {  // session.getAttriute(beaName)  setAttri 						Object scopedInstance = scope.get(beanName, () -> { 							beforePrototypeCreation(beanName); 							try { 								return createBean(beanName, mbd, args); 							} 							finally { 								afterPrototypeCreation(beanName); 							} 						}); 						beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); 					} 					catch (IllegalStateException ex) { 						throw new ScopeNotActiveException(beanName, scopeName, ex); 					} 				} 			} 			catch (BeansException ex) { 				beanCreation.tag("exception", ex.getClass().toString()); 				beanCreation.tag("message", String.valueOf(ex.getMessage())); 				cleanupAfterBeanCreationFailure(beanName); 				throw ex; 			} 			finally { 				beanCreation.end(); 			} 		}  		// 检查通过name所获得到的beanInstance的类型是否是requiredType         //看代码v1.5 		return adaptBeanInstance(name, beanInstance, requiredType); 	}

v1.1 transformedBeanName

根据传入的名字获取bean真正的名字(有可能传入的是别名或者工厂类别名,以&开头的),特别需要说明的是,spring针对于别名专门使用一个map(aliasMap)进行存储,key为别名,而value则是bean真正的名字。所以在创建bena第一步就需要先根据名字获取到bean真正的名字

protected String transformedBeanName(String name) { 		return canonicalName(BeanFactoryUtils.transformedBeanName(name)); 	} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //先判断名字是否是工厂类的名字,如果不是,则直接返回名字,如果是以& 开头的,则循环截取第一个字符直到不以&开头 	public static String transformedBeanName(String name) { 		Assert.notNull(name, "'name' must not be null"); 		if (!name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) { 			return name; 		} 		return transformedBeanNameCache.computeIfAbsent(name, beanName -> { 			do { 				beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length()); 			} 			while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)); 			return beanName; 		}); 	} ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ public String canonicalName(String name) { 		String canonicalName = name; 		// Handle aliasing... 		String resolvedName; 		do { 			//从别名map中获取bean的真实名字 			resolvedName = this.aliasMap.get(canonicalName); 			if (resolvedName != null) { 				canonicalName = resolvedName; 			} 		} 		while (resolvedName != null); 		return canonicalName; 	}
v1.2 getSingleton

获取单例对象

	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { 		Assert.notNull(beanName, "Bean name must not be null"); 		synchronized (this.singletonObjects) { 			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 + "'"); 				} 				//创建bean之前的一些准备 				//1 判断beanName是否是被过滤的,如果是需要过滤的,则抛出异常 				//2 将beanName添加到singletonsCurrentlyInCreation集合中,表示bean正在创建 				//上面条件其中一个失败都会抛出异常 				beforeSingletonCreation(beanName); 				boolean newSingleton = false; 				boolean recordSuppressedExceptions = (this.suppressedExceptions == null); 				if (recordSuppressedExceptions) { 					this.suppressedExceptions = new LinkedHashSet<>(); 				} 				try { 					//开始创建单例对象,调用外部的lambda表达式 					singletonObject = singletonFactory.getObject(); 					newSingleton = true; 				} 				catch (IllegalStateException ex) { 					// Has the singleton object implicitly appeared in the meantime -> 					// if yes, proceed with it since the exception indicates that state. 					singletonObject = this.singletonObjects.get(beanName); 					if (singletonObject == null) { 						throw ex; 					} 				} 				catch (BeanCreationException ex) { 					if (recordSuppressedExceptions) { 						for (Exception suppressedException : this.suppressedExceptions) { 							ex.addRelatedCause(suppressedException); 						} 					} 					throw ex; 				} 				finally { 					if (recordSuppressedExceptions) { 						this.suppressedExceptions = null; 					} 					//结束创建过程 					//1 判断beanName是否是被过滤的,如果是需要过滤的,则抛出异常 					//2 将beanName移除singletonsCurrentlyInCreation集合,表示bean不在创建过程中(已经创建结束了) 					//上面条件其中一个失败都会抛出异常 					afterSingletonCreation(beanName); 				}  				// 添加到单例池 				if (newSingleton) { 					addSingleton(beanName, singletonObject); 				} 			} 			return singletonObject; 		} 	}
v1.3 isDependent
	private boolean isDependent(String beanName, String dependentBeanName, @Nullable Set<String> alreadySeen) { 		if (alreadySeen != null && alreadySeen.contains(beanName)) { 			return false; 		} 		String canonicalName = canonicalName(beanName); 		//dependentBeanMapbeanName为key  以被key依赖的所有bean名字的集合为value 		Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName); 		if (dependentBeans == null) { 			 			return false; 		} 		if (dependentBeans.contains(dependentBeanName)) { 			return true; 		} 		for (String transitiveDependency : dependentBeans) { 			if (alreadySeen == null) { 				alreadySeen = new HashSet<>(); 			} 			alreadySeen.add(beanName); 			if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) { 				return true; 			} 		} 		return false; 	}
v1.4 adaptBeanInstance
	<T> T adaptBeanInstance(String name, Object bean, @Nullable Class<?> requiredType) { 		// Check if required type matches the type of the actual bean instance. 		if (requiredType != null && !requiredType.isInstance(bean)) { 			try { 				// SimpleTypeConverter 				Object convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType); 				if (convertedBean == null) { 					throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); 				} 				return (T) convertedBean; 			} 			catch (TypeMismatchException ex) { 				if (logger.isTraceEnabled()) { 					logger.trace("Failed to convert bean '" + name + "' to required type '" + 							ClassUtils.getQualifiedName(requiredType) + "'", ex); 				} 				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); 			} 		} 		return (T) bean; 	} 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!