Spring【版本5.2.2】容器初始化过程(八)createBean 详解(二)

不得不说,对我们这种平庸的人,学习源码是痛苦的

接着上文

1. doCreateBean >> applyMergedBeanDefinitionPostProcessors

	/**
	 * 将MergedBeanDefinitionPostProcessors应用于指定的bean定义,
	 * 调用它们的postProcessMergedBeanDefinition方法。
	 */
	protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, 
												Class<?> beanType, String beanName) {
		// 1.获取BeanFactory中已注册的BeanPostProcessor
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof MergedBeanDefinitionPostProcessor) {
				// 2.调用MergedBeanDefinitionPostProcessor
				// 的postProcessMergedBeanDefinition方法,
				// 对指定bean的给定MergedBeanDefinition
				// 进行后置处理,@Autowire注解在这边对元数据进行预解析
				MergedBeanDefinitionPostProcessor bdp = 
										(MergedBeanDefinitionPostProcessor) bp;
				bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
			}
		}
	}

2. doCreateBean >> addSingletonFactory

提前曝光 beanName 的 ObjectFactory,用于解决循环引用,我们在preInstantiateSingletons方法中的getSingleton,通过提前曝光的ObjectFactory获得“不完整”的bean实例,从而解决循环引用的问题,ObjectFactory就是通过这边的singletonObjects缓存来进行曝光的。

	protected void addSingletonFactory(String beanName, 
									   ObjectFactory<?> singletonFactory) {
		Assert.notNull(singletonFactory, "Singleton factory must not be null");
		synchronized (this.singletonObjects) {
			// 1.如果beanName不存在于singletonObjects缓存中
			if (!this.singletonObjects.containsKey(beanName)) {
				// 2.将beanName和singletonFactory注册到
				// singletonFactories缓存(beanName -> 该beanName的单例工厂)
				this.singletonFactories.put(beanName, singletonFactory);
				// 3.移除earlySingletonObjects缓存中的beanName
				//(beanName -> beanName的早期单例对象)
				this.earlySingletonObjects.remove(beanName);
				// 4.将beanName注册到registeredSingletons缓存(已经注册的单例集合)
				this.registeredSingletons.add(beanName);
			}
		}
	}

3. doCreateBean >> getEarlyBeanReference

允许返回指定bean的早期引用,若没有则直接返回bean

protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
		Object exposedObject = bean;
		// 1.mbd不是合成 && 存在InstantiationAwareBeanPostProcessors
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				// 2.应用所有SmartInstantiationAwareBeanPostProcessor,
				// 调用getEarlyBeanReference方法
				if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
					SmartInstantiationAwareBeanPostProcessor ibp = 
							(SmartInstantiationAwareBeanPostProcessor) bp;
					// 3.允许SmartInstantiationAwareBeanPostProcessor返回指定bean的早期引用
					exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
				}
			}
		}
		// 4.返回要作为bean引用公开的对象,
		// 如果没有SmartInstantiationAwareBeanPostProcessor修改,
		// 则返回的是入参的bean对象本身
		return exposedObject;
	}

4. doCreateBean >> populateBean

对bean进行属性填充

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		// 1.bw为空时的处理
		if (bw == null) {
			if (mbd.hasPropertyValues()) {
				// 2.1 如果bw为空,属性不为空,抛异常,无法将属性值应用于null实例
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, 
						"Cannot apply property values to null instance");
			}
			else {
				// Skip property population phase for null instance.
				// 2.2 如果bw为空,属性也为空,则跳过
				return;
			}
		}

		// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
		// state of the bean before properties are set. This can be used, for example,
		// to support styles of field injection.
		// 2.用于标识是否继续之后的属性填充
		boolean continueWithPropertyPopulation = true;
		// 3.1 如果mbd不是合成的
		// && 存在InstantiationAwareBeanPostProcessor,则遍历处理InstantiationAwareBeanPostProcessor
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					// 3.2 在bean实例化后,属性填充之前被调用,
					// 允许修改bean的属性,如果返回false,则跳过之后的属性填充
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						// 3.3 如果返回false,将continueWithPropertyPopulation赋值为false,
						// 代表要跳过之后的属性填充
						continueWithPropertyPopulation = false;
						break;
					}
				}
			}
		}
		// 3.4 如果continueWithPropertyPopulation为false,则跳过之后的属性填充
		if (!continueWithPropertyPopulation) {
			return;
		}
		// 返回此bean的属性值
		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

		int resolvedAutowireMode = mbd.getResolvedAutowireMode();
		// 4.解析自动装配模式为AUTOWIRE_BY_NAME和AUTOWIRE_BY_TYPE
		if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
			// Add property values based on autowire by name if applicable.
			if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
				// 4.1 解析autowireByName的注入
				autowireByName(beanName, mbd, bw, newPvs);
			}
			// Add property values based on autowire by type if applicable.
			if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
				// 4.2 解析autowireByType的注入
				autowireByType(beanName, mbd, bw, newPvs);
			}
			pvs = newPvs;
		}
		// 5.BeanFactory是否注册过InstantiationAwareBeanPostProcessors
		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
		// 6.是否需要依赖检查
		boolean needsDepCheck = 
					(mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

		PropertyDescriptor[] filteredPds = null;
		// 7.注册过InstantiationAwareBeanPostProcessors
		if (hasInstAwareBpps) {
			if (pvs == null) {
				pvs = mbd.getPropertyValues();
			}
			// 7.1 应用后置处理器InstantiationAwareBeanPostProcessor
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = 
								(InstantiationAwareBeanPostProcessor) bp;
					PropertyValues pvsToUse = 
								ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
					if (pvsToUse == null) {
						if (filteredPds == null) {
							filteredPds = 
									filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
						}
						// 7.1.1 应用后置处理器InstantiationAwareBeanPostProcessor的方法
						// postProcessPropertyValues,进行属性填充前的再次处理。
						// 例子:现在最常用的@Autowire属性注入就是这边注入依赖的bean实例对象
						pvsToUse = ibp.postProcessPropertyValues(pvs, 
								filteredPds, bw.getWrappedInstance(), beanName);
						if (pvsToUse == null) {
							return;
						}
					}
					pvs = pvsToUse;
				}
			}
		}
		if (needsDepCheck) {
			if (filteredPds == null) {
				filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
			}
			// 7.2 依赖检查,对应depends-on属性
			checkDependencies(beanName, mbd, filteredPds, pvs);
		}

		if (pvs != null) {
			// 8.将所有PropertyValues中的属性填充到bean中
			applyPropertyValues(beanName, mbd, bw, pvs);
		}
	}

5. populateBean >>autowireByName

protected void autowireByName(
			String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
		// 1.寻找bw中需要依赖注入的属性
		String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
		for (String propertyName : propertyNames) {
			// 2.校验是否存在beanName=propertyName的bean实例或者BeanDefinition
			if (containsBean(propertyName)) {
				// 3.获取propertyName的bean实例对象
				Object bean = getBean(propertyName);
				// 4.将属性名和属性值添加到pvs
				pvs.add(propertyName, bean);
				// 5.注册依赖关系到缓存(beanName依赖propertyName)
				registerDependentBean(propertyName, beanName);
				if (logger.isTraceEnabled()) {
					logger.trace("Added autowiring by name from bean name '" + beanName +
							"' via property '" + propertyName + "' to bean named '" + propertyName + "'");
				}
			}
			else {
				if (logger.isTraceEnabled()) {
					logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName +
							"' by name: no matching bean found");
				}
			}
		}
	}

6. autowireByName >> unsatisfiedNonSimpleProperties

protected String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) {
		Set<String> result = new TreeSet<>();
		// 1.拿到mdb的属性值
		PropertyValues pvs = mbd.getPropertyValues();
		// 2.拿到bw的PropertyDescriptors
		PropertyDescriptor[] pds = bw.getPropertyDescriptors();
		// 3.遍历bw的PropertyDescriptors
		for (PropertyDescriptor pd : pds) {
			// 4.pd用于写入属性值的方法不为空
			// && pd不是从依赖性检查中排除的bean属性
			// && pd不包含在pvs里
			// && pd的属性类型不是“简单”属性(基础类型、枚举、Number等)
			// 4.1 isSimpleProperty: 判断属性是不是“简单”属性
			if (pd.getWriteMethod() != null && !isExcludedFromDependencyCheck(pd) && !pvs.contains(pd.getName()) &&
					!BeanUtils.isSimpleProperty(pd.getPropertyType())) {
				// 4.2 符合条件,则添加pd的name到result中
				result.add(pd.getName());
			}
		}
		return StringUtils.toStringArray(result);
	}

7. unsatisfiedNonSimpleProperties >> isSimpleProperty

	public static boolean isSimpleProperty(Class<?> type) {
		Assert.notNull(type, "'type' must not be null");
		// clazz是简单值类型 
		// || ( clazz是数组 && clazz的组件类型为简单值类型)
		// getComponentType:返回数组的组件类型
		// 例如: String[] 返回 String.class,如果是非数组,则返回null
		return isSimpleValueType(type) || (type.isArray() && isSimpleValueType(type.getComponentType()));
	}

	public static boolean isSimpleValueType(Class<?> type) {
		return (Void.class != type && void.class != type &&
				(ClassUtils.isPrimitiveOrWrapper(type) ||
				Enum.class.isAssignableFrom(type) ||
				CharSequence.class.isAssignableFrom(type) ||
				Number.class.isAssignableFrom(type) ||
				Date.class.isAssignableFrom(type) ||
				Temporal.class.isAssignableFrom(type) ||
				URI.class == type ||
				URL.class == type ||
				Locale.class == type ||
				Class.class == type));
	}
	
	public static boolean isPrimitiveOrWrapper(Class<?> clazz) {
		Assert.notNull(clazz, "Class must not be null");
		// clazz为基础类型 或者 clazz是基础类型的封装类
		return (clazz.isPrimitive() || isPrimitiveWrapper(clazz));
	}
	static {
		primitiveWrapperTypeMap.put(Boolean.class, boolean.class);
		primitiveWrapperTypeMap.put(Byte.class, byte.class);
		primitiveWrapperTypeMap.put(Character.class, char.class);
		primitiveWrapperTypeMap.put(Double.class, double.class);
		primitiveWrapperTypeMap.put(Float.class, float.class);
		primitiveWrapperTypeMap.put(Integer.class, int.class);
		primitiveWrapperTypeMap.put(Long.class, long.class);
		primitiveWrapperTypeMap.put(Short.class, short.class);
		primitiveWrapperTypeMap.put(Void.class, void.class);
		...
	}

8. autowireByName >> containsBean

	@Override
	public boolean containsBean(String name) {
		// 1.将name转换为真正的beanName
		String beanName = transformedBeanName(name);
		// 2.检查singletonObjects缓存和beanDefinitionMap缓存中是否存在beanName
		if (containsSingleton(beanName) || containsBeanDefinition(beanName)) {
			// 3.name不带&前缀,或者是FactoryBean,则返回true
			return (!BeanFactoryUtils.isFactoryDereference(name) || isFactoryBean(name));
		}
		// Not found -> check parent.
		// 4.没有找到则检查parentBeanFactory
		BeanFactory parentBeanFactory = getParentBeanFactory();
		return (parentBeanFactory != null && parentBeanFactory.containsBean(originalBeanName(name)));
	}

9. populateBean >> autowireByType

	protected void autowireByType(
			String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {

		TypeConverter converter = getCustomTypeConverter();
		if (converter == null) {
			converter = bw;
		}

		Set<String> autowiredBeanNames = new LinkedHashSet<>(4);
		// 1.寻找bw中需要依赖注入的属性
		String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
		// 2.遍历所有需要依赖注入的属性
		for (String propertyName : propertyNames) {
			try {
				PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
				// Don't try autowiring by type for type Object: never makes sense,
				// even if it technically is a unsatisfied, non-simple property.
				if (Object.class != pd.getPropertyType()) {
					// 3.获取指定属性的set方法,封装成MethodParameter(必须有set方法才能通过属性来注入)
					MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
					// Do not allow eager init for type matching in case of a prioritized post-processor.
					boolean eager = !PriorityOrdered.class.isInstance(bw.getWrappedInstance());
					// 4.将MethodParameter的方法参数索引信息封装成DependencyDescriptor
					DependencyDescriptor desc = 
							new AutowireByTypeDependencyDescriptor(methodParam, eager);
					// 5.解析当前属性所匹配的bean实例,
					// 并把解析到的bean实例的beanName存储在autowiredBeanNames中
					Object autowiredArgument = 
								resolveDependency(desc, beanName, autowiredBeanNames, converter);
					if (autowiredArgument != null) {
						// 6.如果找到了依赖的bean实例,将属性名和bean实例放到pvs中
						pvs.add(propertyName, autowiredArgument);
					}
					for (String autowiredBeanName : autowiredBeanNames) {
						// 7.注册依赖关系,beanName依赖autowiredBeanName
						registerDependentBean(autowiredBeanName, beanName);
						if (logger.isTraceEnabled()) {
							logger.trace("Autowiring by type from bean name '" 
							+ beanName + "' via property '" 
							+ propertyName + "' to bean named '" + autowiredBeanName + "'");
						}
					}
					autowiredBeanNames.clear();
				}
			}
			catch (BeansException ex) {
				throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), 
						beanName, propertyName, ex);
			}
		}
	}

10. populateBean >> applyPropertyValues

	protected void applyPropertyValues(String beanName, BeanDefinition mbd, 
									   BeanWrapper bw, PropertyValues pvs) {
		if (pvs.isEmpty()) {
			return;
		}

		if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
			((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
		}

		MutablePropertyValues mpvs = null;
		List<PropertyValue> original;
		// 1.获取属性值列表
		if (pvs instanceof MutablePropertyValues) {
			mpvs = (MutablePropertyValues) pvs;
			// 1.1 如果mpvs中的值已经被转换为对应的类型,那么可以直接设置到BeanWrapper中
			if (mpvs.isConverted()) {
				// Shortcut: use the pre-converted values as-is.
				try {
					bw.setPropertyValues(mpvs);
					return;
				}
				catch (BeansException ex) {
					throw new BeanCreationException(
							mbd.getResourceDescription(), beanName,
								 "Error setting property values", ex);
				}
			}
			original = mpvs.getPropertyValueList();
		}
		else {
			// 1.2 如果pvs并不是使用MutablePropertyValues封装的类型,
			// 那么直接使用原始的属性获取方法
			original = Arrays.asList(pvs.getPropertyValues());
		}

		TypeConverter converter = getCustomTypeConverter();
		if (converter == null) {
			converter = bw;
		}
		// 2.1 获取对应的解析器
		BeanDefinitionValueResolver valueResolver = 
				new BeanDefinitionValueResolver(this, beanName, mbd, converter);

		// Create a deep copy, resolving any references for values.
		// 2.2 创建深层拷贝副本,用于存放解析后的属性值
		List<PropertyValue> deepCopy = new ArrayList<>(original.size());
		boolean resolveNecessary = false;
		// 3.遍历属性,将属性转换为对应类的对应属性的类型
		for (PropertyValue pv : original) {
			if (pv.isConverted()) {
				// 3.1 如果pv已经包含转换的值,则直接添加到deepCopy
				deepCopy.add(pv);
			}
			else {
				// 3.2 否则,进行转换
				// 3.2.1 拿到pv的原始属性名和属性值
				String propertyName = pv.getName();
				Object originalValue = pv.getValue();
				if (originalValue == AutowiredPropertyMarker.INSTANCE) {
					Method writeMethod = bw.getPropertyDescriptor(propertyName).getWriteMethod();
					if (writeMethod == null) {
						throw new IllegalArgumentException(
								"Autowire marker for property without write method: " + pv);
					}
					originalValue = new DependencyDescriptor(new MethodParameter(writeMethod, 0), true);
				}

				// 3.2.2 使用解析器解析原始属性值
				Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
				Object convertedValue = resolvedValue;
				// 3.2.3 判断该属性是否可转换
				boolean convertible = bw.isWritableProperty(propertyName) &&
						!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
				if (convertible) {
					// 3.2.4 如果可转换,则转换指定目标属性的给定值
					convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
				}
				// Possibly store converted value in merged bean definition,
				// in order to avoid re-conversion for every created bean instance.
				// 3.2.5 在合并的BeanDefinition中存储转换后的值,以避免为每个创建的bean实例重新转换
				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));
				}
			}
		}
		if (mpvs != null && !resolveNecessary) {
			mpvs.setConverted();
		}
		// Set our (possibly massaged) deep copy.
		try {
			// 4.设置bean的属性值为deepCopy
			bw.setPropertyValues(new MutablePropertyValues(deepCopy));
		}
		catch (BeansException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Error setting property values", ex);
		}
	}

11. doCreateBean >> initializeBean

执行后置处理器,aop就是在这里完成的

protected Object initializeBean(final String beanName, final Object bean, 
								@Nullable RootBeanDefinition mbd) {
		// 1.激活Aware方法
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			// 执行后置处理器的postProcessBeforeInitialization
			// 2.在初始化前应用BeanPostProcessor的postProcessBeforeInitialization方法,允许对bean实例进行包装
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
			// 执行bean的声明周期回调中的init方法
			// 3.调用初始化方法
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {
			//执行后置处理器的postProcessAfterInitialization方法
			// 4.在初始化后应用BeanPostProcessor的postProcessAfterInitialization方法,允许对bean实例进行包装
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		// 5.返回wrappedBean
		return wrappedBean;
	}

12. initializeBean >> invokeAwareMethods

	private void invokeAwareMethods(final String beanName, final Object bean) {
		if (bean instanceof Aware) {
			// BeanNameAware: 实现此接口的类想要拿到beanName,因此我们在这边赋值给它
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean).setBeanName(beanName);
			}
			// BeanClassLoaderAware:实现此接口的类想要拿到beanClassLoader,因此我们在这边赋值给它
			if (bean instanceof BeanClassLoaderAware) {
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			// BeanFactoryAware: 实现此接口的类想要拿到 BeanFactory,因此我们在这边赋值给它
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

13. initializeBean >> applyBeanPostProcessorsBeforeInitialization

	@Override
	public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
		// 1.遍历所有注册的BeanPostProcessor实现类,调用postProcessBeforeInitialization方法
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			// 2.在bean初始化方法执行前,调用postProcessBeforeInitialization方法
			Object current = processor.postProcessBeforeInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}

14. initializeBean >> postProcessBeforeInitialization

ApplicationContextAwareProcessor.postProcessBeforeInitialization

	@Override
	@Nullable
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
				bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
				bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)){
			return bean;
		}

		AccessControlContext acc = null;

		if (System.getSecurityManager() != null) {
			acc = this.applicationContext.getBeanFactory().getAccessControlContext();
		}

		if (acc != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareInterfaces(bean);
				return null;
			}, acc);
		}
		else {
			// 调用Aware接口
			invokeAwareInterfaces(bean);
		}

		return bean;
	}

	private void invokeAwareInterfaces(Object bean) {
		if (bean instanceof EnvironmentAware) {
			((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
		}
		if (bean instanceof EmbeddedValueResolverAware) {
			((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
		}
		if (bean instanceof ResourceLoaderAware) {
			((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
		}
		if (bean instanceof ApplicationEventPublisherAware) {
			((ApplicationEventPublisherAware) bean).
			setApplicationEventPublisher(this.applicationContext);
		}
		if (bean instanceof MessageSourceAware) {
			((MessageSourceAware) bean).setMessageSource(this.applicationContext);
		}
		if (bean instanceof ApplicationContextAware) {
			((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
		}
	}

15. initializeBean >> invokeInitMethods

执行bean的声明周期回调中的init方法

protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
			throws Throwable {
		// 1.首先检查bean是否实现了InitializingBean接口,如果是的话调用afterPropertiesSet方法
		boolean isInitializingBean = (bean instanceof InitializingBean);
		if (isInitializingBean && (mbd == null || 
			!mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
			if (logger.isTraceEnabled()) {
				logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
			}
			// 2.调用afterPropertiesSet方法
			if (System.getSecurityManager() != null) {
				try {
					AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
						((InitializingBean) bean).afterPropertiesSet();
						return null;
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
				((InitializingBean) bean).afterPropertiesSet();
			}
		}

		if (mbd != null && bean.getClass() != NullBean.class) {
			String initMethodName = mbd.getInitMethodName();
			if (StringUtils.hasLength(initMethodName) &&
					!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {
				// 3.调用自定义初始化方法
				invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	}

16. invokeInitMethods >> invokeCustomInitMethod

	protected void invokeCustomInitMethod(String beanName, final Object bean, RootBeanDefinition mbd)
			throws Throwable {
		// 1.拿到初始化方法的方法名
		String initMethodName = mbd.getInitMethodName();
		Assert.state(initMethodName != null, "No init method set");
		// 2.根据方法名拿到方法
		Method initMethod = (mbd.isNonPublicAccessAllowed() ?
				BeanUtils.findMethod(bean.getClass(), initMethodName) :
				ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName));

		if (initMethod == null) {
			// 3.如果不存在initMethodName对应的方法,并且是强制执行初始化方法(默认为强制), 则抛出异常
			if (mbd.isEnforceInitMethod()) {
				throw new BeanDefinitionValidationException("Could not find an init method named '" +
						initMethodName + "' on bean with name '" + beanName + "'");
			}
			else {
				if (logger.isTraceEnabled()) {
					logger.trace("No default init method named '" + initMethodName +
							"' found on bean with name '" + beanName + "'");
				}
				// Ignore non-existent default lifecycle methods.
				return;
			}
		}

		if (logger.isTraceEnabled()) {
			logger.trace("Invoking init method  '" 
						+ initMethodName + "' on bean with name '" + beanName + "'");
		}
		Method methodToInvoke = ClassUtils.getInterfaceMethodIfPossible(initMethod);
		// 4.调用初始化方法
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				ReflectionUtils.makeAccessible(methodToInvoke);
				return null;
			});
			try {
				AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () ->
						methodToInvoke.invoke(bean), getAccessControlContext());
			}
			catch (PrivilegedActionException pae) {
				InvocationTargetException ex = (InvocationTargetException) pae.getException();
				throw ex.getTargetException();
			}
		}
		else {
			try {
				ReflectionUtils.makeAccessible(methodToInvoke);
				methodToInvoke.invoke(bean);
			}
			catch (InvocationTargetException ex) {
				throw ex.getTargetException();
			}
		}
	}

17. initializeBean >> applyBeanPostProcessorsAfterInitialization

	@Override
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
		// 1.遍历所有注册的BeanPostProcessor实现类,调用postProcessAfterInitialization方法
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			// 2.在bean初始化后,调用postProcessAfterInitialization方法
			Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				// 3.如果返回null,则不会调用后续的BeanPostProcessors
				return result;
			}
			result = current;
		}
		return result;
	}

18. doCreateBean >> registerDisposableBeanIfNecessary

注册用于销毁的bean,执行销毁操作的有三种:自定义destroy方法、DisposableBean接口、DestructionAwareBeanPostProcessor

	protected void registerDisposableBeanIfNecessary(String beanName, 
													 Object bean, RootBeanDefinition mbd) {
		AccessControlContext acc = 
				(System.getSecurityManager() != null ? getAccessControlContext() : null);
		// 1.mbd的scope不是prototype && 给定的bean需要在关闭时销毁
		if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {
			// 2.单例模式下注册用于销毁的bean到disposableBeans缓存,执行给定bean的所有销毁工作:
			if (mbd.isSingleton()) {
				// Register a DisposableBean implementation that performs all destruction
				// work for the given bean: DestructionAwareBeanPostProcessors,
				// DisposableBean interface, custom destroy method.
				// 2.1 DisposableBeanAdapter:使用DisposableBeanAdapter来封装用于销毁的bean
				registerDisposableBean(beanName,
						new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
			}
			else {
				// A bean with a custom scope...
				// 3.自定义scope处理
				Scope scope = this.scopes.get(mbd.getScope());
				if (scope == null) {
					throw new IllegalStateException("No Scope registered for scope name '" 
													+ mbd.getScope() + "'");
				}
				scope.registerDestructionCallback(beanName,
						new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
			}
		}
	}

19. registerDisposableBeanIfNecessary >> requiresDestruction

	protected boolean requiresDestruction(Object bean, RootBeanDefinition mbd) {
		// 1.DisposableBeanAdapter.hasDestroyMethod(bean, mbd):判断bean是否有destroy方法
		// 2.hasDestructionAwareBeanPostProcessors():
		// 判断当前BeanFactory是否注册过DestructionAwareBeanPostProcessor
		// 3.DisposableBeanAdapter.hasApplicableProcessors:
		// 是否存在适用于bean的DestructionAwareBeanPostProcessor
		return (bean.getClass() != NullBean.class &&
				(DisposableBeanAdapter.hasDestroyMethod(bean, mbd) || 
				(hasDestructionAwareBeanPostProcessors() &&
				DisposableBeanAdapter.hasApplicableProcessors(bean, getBeanPostProcessors()))));
	}

20. requiresDestruction >> hasDestroyMethod

	public static boolean hasDestroyMethod(Object bean, RootBeanDefinition beanDefinition) {
		if (bean instanceof DisposableBean || bean instanceof AutoCloseable) {
			// 1.如果bean实现了DisposableBean接口 或者 bean是AutoCloseable实例,则返回true
			return true;
		}
		// 2.拿到bean自定义的destroy方法名
		String destroyMethodName = beanDefinition.getDestroyMethodName();
		if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName)) {
			// 3.如果自定义的destroy方法名为“(inferred)”(该名字代表需要我们自己去推测destroy的方法名),
			// 则检查该bean是否存在方法名为“close”或“shutdown”的方法,如果存在,则返回true
			return (ClassUtils.hasMethod(bean.getClass(), CLOSE_METHOD_NAME) ||
					ClassUtils.hasMethod(bean.getClass(), SHUTDOWN_METHOD_NAME));
		}
		// 4.如果destroyMethodName不为空,则返回true
		return StringUtils.hasLength(destroyMethodName);
	}

21. requiresDestruction >> hasApplicableProcessors

	public static boolean hasApplicableProcessors(Object bean, List<BeanPostProcessor> postProcessors) {
		if (!CollectionUtils.isEmpty(postProcessors)) {
			// 1.遍历所有的BeanPostProcessor
			for (BeanPostProcessor processor : postProcessors) {
				// 2.如果processor是DestructionAwareBeanPostProcessor
				if (processor instanceof DestructionAwareBeanPostProcessor) {
					DestructionAwareBeanPostProcessor dabpp = 
									(DestructionAwareBeanPostProcessor) processor;
					if (dabpp.requiresDestruction(bean)) {
						// 3.如果给定的bean实例需要通过此后处理器进行销毁,则返回true
						return true;
					}
				}
			}
		}
		return false;
	}

22.registerDisposableBeanIfNecessary >> DisposableBeanAdapter

	public DisposableBeanAdapter(Object bean, String beanName, RootBeanDefinition beanDefinition,
			List<BeanPostProcessor> postProcessors, @Nullable AccessControlContext acc) {

		Assert.notNull(bean, "Disposable bean must not be null");
		this.bean = bean;
		this.beanName = beanName;
		// 1.判断bean是否需要调用DisposableBean的destroy方法
		this.invokeDisposableBean =
				(this.bean instanceof DisposableBean && 
				!beanDefinition.isExternallyManagedDestroyMethod("destroy"));
		this.nonPublicAccessAllowed = beanDefinition.isNonPublicAccessAllowed();
		this.acc = acc;
		// 2.拿到自定义的destroy方法名
		String destroyMethodName = inferDestroyMethodIfNecessary(bean, beanDefinition);
		if (destroyMethodName != null && !(this.invokeDisposableBean && 
			"destroy".equals(destroyMethodName)) &&
			!beanDefinition.isExternallyManagedDestroyMethod(destroyMethodName)) {
			this.destroyMethodName = destroyMethodName;
			// 3.拿到自定义的destroy方法,赋值给this.destroyMethod
			Method destroyMethod = determineDestroyMethod(destroyMethodName);
			if (destroyMethod == null) {
				if (beanDefinition.isEnforceDestroyMethod()) {
					// 4.如果destroy方法名为空,并且enforceDestroyMethod为true,则抛出异常
					throw new BeanDefinitionValidationException(
							"Could not find a destroy method named '" +
							destroyMethodName + "' on bean with name '" + beanName + "'");
				}
			}
			else {
				// 5.拿到destroy方法的参数类型数组
				Class<?>[] paramTypes = destroyMethod.getParameterTypes();
				if (paramTypes.length > 1) {
					// 6.如果destroy方法的参数大于1个,则抛出异常
					throw new BeanDefinitionValidationException(
							"Method '" + destroyMethodName + "' of bean '" + beanName 
							+ "' has more than one parameter - not supported as destroy method");
				}
				else if (paramTypes.length == 1 && boolean.class != paramTypes[0]) {
					// 7.如果destroy方法的参数为1个,并且该参数的类型不为boolean,则抛出异常
					throw new BeanDefinitionValidationException("Method '" + destroyMethodName 
					+ "' of bean '" + beanName 
					+ "' has a non-boolean parameter - not supported as destroy method");
				}
				destroyMethod = ClassUtils.getInterfaceMethodIfPossible(destroyMethod);
			}
			this.destroyMethod = destroyMethod;
		}
		// 8.查找DestructionAwareBeanPostProcessors,并赋值给this.beanPostProcessors
		this.beanPostProcessors = filterPostProcessors(postProcessors, bean);
	}

23.DisposableBeanAdapter >> inferDestroyMethodIfNecessary

    @Nullable
	private String inferDestroyMethodIfNecessary(Object bean, RootBeanDefinition beanDefinition) {
		// 1.拿到beanDefinition的destroy方法名
		String destroyMethodName = beanDefinition.getDestroyMethodName();
		// 2.如果destroy方法名为“(inferred)”|| destroyMethodName为null,并且bean是AutoCloseable实例
		if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName) ||
				(destroyMethodName == null && bean instanceof AutoCloseable)) {
			// Only perform destroy method inference or Closeable detection
			// in case of the bean not explicitly implementing DisposableBean
			// 3.如果bean没有实现DisposableBean接口,则尝试推测destroy方法的名字
			if (!(bean instanceof DisposableBean)) {
				try {
					// 4.尝试在bean中寻找方法名为close的方法作为destroy方法
					return bean.getClass().getMethod(CLOSE_METHOD_NAME).getName();
				}
				catch (NoSuchMethodException ex) {
					try {
						// 5.尝试在bean中寻找方法名为close的方法作为shutdown方法
						return bean.getClass().getMethod(SHUTDOWN_METHOD_NAME).getName();
					}
					catch (NoSuchMethodException ex2) {
						// no candidate destroy method found
					}
				}
			}
			// 6.如果没有找到,则返回null
			return null;
		}
		return (StringUtils.hasLength(destroyMethodName) ? destroyMethodName : null);
	}

24.DisposableBeanAdapter >> filterPostProcessors

	@Nullable
	private List<DestructionAwareBeanPostProcessor> filterPostProcessors(
										List<BeanPostProcessor> processors, Object bean) {
		List<DestructionAwareBeanPostProcessor> filteredPostProcessors = null;
		if (!CollectionUtils.isEmpty(processors)) {
			filteredPostProcessors = new ArrayList<>(processors.size());
			// 1.遍历所有的BeanPostProcessor
			for (BeanPostProcessor processor : processors) {
				// 2.如果processor是DestructionAwareBeanPostProcessor
				if (processor instanceof DestructionAwareBeanPostProcessor) {
					DestructionAwareBeanPostProcessor dabpp = 
						(DestructionAwareBeanPostProcessor) processor;
					if (dabpp.requiresDestruction(bean)) {
						// 3.如果给定的bean实例需要通过此后处理器进行销毁,则添加到filteredPostProcessors
						filteredPostProcessors.add(dabpp);
					}
				}
			}
		}
		return filteredPostProcessors;
	}

单元测试

留个坑。。

总结

spring初期初始化,最后几篇文章都是参考程序员囧辉的,之所以没改成转载,是因为后续要添加更多的理解,以及相关测试代码,还有自己的东西, 所以。
在 finishBeanFactoryInitialization 方法中,我们主要做了以下操作:

  • 将之前解析的 BeanDefinition 进一步处理,将有父 BeanDefinition 的进行合并,获得 MergedBeanDefinition
  • 尝试从缓存获取 bean 实例
  • 处理特殊的 bean —— FactoryBean 的创建
  • 创建 bean 实例
  • 循环引用的处理
  • bean 实例属性填充
  • bean 实例的初始化
  • BeanPostProcessor 的各种扩展应用
参考

https://blog.csdn.net/v123411739/article/details/88077817

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值