Spring5 IOC源码解读系列13—createBean方法

一 概述

createBean顾名思义是创建bean对象的实例,但是实际干活还是调用doCreateBean去实例化对象。如果对应的bean是单例的,则会被添加到一级缓存中,并将二三级缓存的数据删除。

这里有个两个重要的概念,一个是循环依赖,说简单点就是两个Bean存在相互引用的情况,在Sspring中当且仅当Bean的类型为单例且属性注入存在对其他Bean的引用的情况下,Spring通过三级缓存解决了循环依赖问题,其他场景(Bean非单例,构造函数存在对其他Bean的依赖等)都会抛出异常!
另外一个就是Bean的生命周期,就是从Bean对象被实例化直至Bean被销毁的流程

本文主要从解决循环依赖和讲述Bean生命周期的角度去撰写,其他不次要的类和方法不会详细展开。

二 Spring Bean循环依赖的例子

定义两个bean:ServiceA(服务A)和ServiceB(服务B),且服务A和服务B存在属性值的相互依赖

2.1 修改配置文件

<bean id="serviceA" class="com.service.ServiceA">
        <property name="serviceB" ref="serviceB"/>
    </bean>

<bean id="serviceB" class="com..service.ServiceB">
    <property name="serviceA" ref="serviceA"/>
</bean>

2.2 服务A代码

public class ServiceA {
    private ServiceB serviceB;

    public ServiceB getServiceB(){
        return serviceB;
    }

    public void setServiceB(ServiceB serviceB){
        this.serviceB = serviceB;
    }

    public ServiceA(){
        System.out.println("---ServiceA created success");
    }
}

2.3 服务B代码

public class ServiceB {
    private ServiceA serviceA;

    public ServiceA getServiceA(){
        return serviceA;
    }

    public void setServiceA(ServiceA serviceA){
        this.serviceA = serviceA;
    }

    public ServiceB(){
        System.out.println("---ServiceB created success");
    }
}

2.4 测试代码

public class BeanLifeCycle{

    public static void main(String[] args) throws  Exception{

        System.out.println("现在开始初始化容器");

        ApplicationContext factory = new ClassPathXmlApplicationContext("beans.xml");

        System.out.println("容器初始化成功");
        ServiceA serviceA = (ServiceA)factory.getBean("serviceA");
        ServiceB serviceB = serviceA.getServiceB();
        ServiceB serviceB2 = (ServiceB)factory.getBean("serviceB");
        System.out.println("serviceB == serviceB2: " + (serviceB == serviceB2));

        System.out.println("现在开始关闭容器!");
        ((ClassPathXmlApplicationContext) factory).close();

    }
}

2.5 日志

现在开始初始化容器
---ServiceA created success
---ServiceB created success
容器初始化成功
serviceB == serviceB2: true
现在开始关闭容器!

三 Spring Bean循环依赖流程分析

图片中红色字体的部分是关键,通过三级缓存机制,完美解决Spring Bean的循环依赖。
在这里插入图片描述

四 Spring Bean生命周期对应的方法

虚线左边流程图是根据《Spring实战》中提供的Spring Bean生命周期的流程,但是美中不足的是没把每一步对应的大致方法对应上去。在后面分析createBean源码的过程中,基本涵盖了Spring Bean生命周期的发部分源码(除了销毁部分),因此在这类系统性总结Spring Bean生命周期每一步对应的方法调用,后面读者看代码就清楚了。

在这里插入图片描述
另外这个生命周期流程还有个缺点是没有涉及容器销毁。当容器关闭时候(调用close()方法,会依次执行
1)回调DestructionAwareBeanPostProcessor接口实现类的postProcessBeforeDestruction方法
2)回调DiposibleBean接口实现类的destory()方法
3)回调配置文件的destroy-method属性指定的销毁方法

五 源码

createBean方法方法主要为真正创建bean对象(调用doCreateBean)前后做铺垫,了解下就可以。

5.1 createBean方法

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {

		if (logger.isTraceEnabled()) {
			logger.trace("Creating instance of bean '" + beanName + "'");
		}
        //定义临时变量
		RootBeanDefinition mbdToUse = mbd;

		// Make sure bean class is actually resolved at this point, and
		// clone the bean definition in case of a dynamically resolved Class
		// which cannot be stored in the shared merged bean definition.
        //获取bean对象的类型
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
        
        //类型为null 且 mbd的beanClass属性为空 且 全类名为空
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {   
             //使用mbd为入参,新创建一个RootBeanDefinition
			mbdToUse = new RootBeanDefinition(mbd);
            //mbdToUse的BeanClass赋值为resolvedClass
			mbdToUse.setBeanClass(resolvedClass);
		}

		// Prepare method overrides.
		try {
            //验证并准备当前 bean定义的覆盖方法。 检查具有指定名称的方法是否存在。
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
			//抛出异常
		}

		try {
			// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
            //用于bean实例化前的后处理器,解决指定 bean 是否有实例化前的快捷方式。让 BeanPostProcessors 有机会返回一个代理而不是目标 bean 实例。
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            //bean不为空
			if (bean != null) {
            //快速返回bean对象
				return bean;
			}
		}
		catch (Throwable ex) {
			//抛出异常
		}

		try {
        //真正动手创建Bean的实例
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			if (logger.isTraceEnabled()) {
				logger.trace("Finished creating instance of bean '" + beanName + "'");
			}
            //返回bean的实例化对象
			return beanInstance;
		}
	
        //异常		
	}

5.2 doCreateBean方法

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {

		// Instantiate the bean.
        //Bean的包装类
		BeanWrapper instanceWrapper = null;
      
      //bean为单例
		if (mbd.isSingleton()) {
        //从缓存中移除factoryBean,如果当前bean属于factoryBean,则instanceWrapper不为空
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
        
        //instanceWrapper为空
		if (instanceWrapper == null) {
         //bean对象的实例化
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
        //获取bean对象
		final Object bean = instanceWrapper.getWrappedInstance();
        //获取bean对象的类型
		Class<?> beanType = instanceWrapper.getWrappedClass();
        //不为空bean
		if (beanType != NullBean.class) {
            //记录bean的类型
	  		mbd.resolvedTargetType = beanType;
		}

		// Allow post-processors to modify the merged bean definition.
		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				try {
                //判断作用于当前bean的后置处理器是否实现MergedBeanDefinitionPostProcessor接口。若是则调用postProcessMergedBeanDefinition方法。主要是处理 @PreDestory 、@PostConstruct、@Autowire、@Value和@Resource等注解
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(mbd.getResourceDescription(), beanName,
							"Post-processing of merged bean definition failed", ex);
				}
				mbd.postProcessed = true;
			}
		}

		// Eagerly cache singletons to be able to resolve circular references
		// even when triggered by lifecycle interfaces like BeanFactoryAware.
        
        //Bean 是单例 && 支持循环依赖 && Bean正在创建
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isTraceEnabled()) {
				logger.trace("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
            //添加到三级缓存中
            //这一步是解决循环依赖的关键,因为先将服务A放入三级缓存中, 后期服务B的属性注入阶段,发现自己依赖服务A,就可以通过三级缓存获取服务A,从而完成属性注入
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
		}

		// Initialize the bean instance.   
        //bean的实例
		Object exposedObject = bean;
		try {
          //属性注入
			populateBean(beanName, mbd, instanceWrapper);
            //初始化
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
		catch (Throwable ex) {
			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
				throw (BeanCreationException) ex;
			}
			else {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
			}
		}

		if (earlySingletonExposure) {
         //从一级或者二级缓存中获取bean对象
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				}
                //省略
			}
		}

		// Register bean as disposable.
		try {
        //检查bean对象)否需实现DisposableBean接口2)是否有配置属性“destroy-method”3)是否有作用于当前Bean的实现Destruction接口的后置处理器。如果有满足的条件,则注册到相应的容器中,当bean销毁/Spring工厂关闭时,则会回调相关方法。
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}
        
        //返回bean对象
		return exposedObject;
	}

5.3 createBeanInstance方法

通过createBeanInstance方法完成Bean对象的实例化,此时属性还没有注入

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
		// Make sure bean class is actually resolved at this point.
     //获取beanName对应的Class类的对象
		Class<?> beanClass = resolveBeanClass(mbd, beanName);

       //beanClass不为空 
       //eanClass非公开类 
       //没有权限访问公共非公共的构造函数和方法
		if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
          //抛出异常
			throw new BeanCreationException(mbd.getResourceDescription(), beanName,
					"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
		}

        //省略
		// No special handling: simply use no-arg constructor.
		return instantiateBean(beanName, mbd);
	}
    
        
    protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
		try {
			Object beanInstance;
			final BeanFactory parent = this;
            //安全相关
			if (System.getSecurityManager() != null) {
				beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
						getInstantiationStrategy().instantiate(mbd, beanName, parent),
						getAccessControlContext());
			}
			else {
            //调用反射完成bean对象的实例化
				beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
			}
            //封装Bean对象到包装类
			BeanWrapper bw = new BeanWrapperImpl(beanInstance);
			initBeanWrapper(bw);
            
            //返回包装类
			return bw;
		}
	    //异常处理

5.4 addSingletonFactory

beanName对应的bean对象已经实例,但是还没有完成Bean的初始化。通过addSingletonFactory将此beanName添加到三级缓存中。

	protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(singletonFactory, "Singleton factory must not be null");
		synchronized (this.singletonObjects) {
			if (!this.singletonObjects.containsKey(beanName)) {
            //添加到三级缓存中
				this.singletonFactories.put(beanName, singletonFactory);
                //从二级缓存中移除
				this.earlySingletonObjects.remove(beanName);
                //添加到单例注册表中
                //记录单例Bean添加的顺序
				this.registeredSingletons.add(beanName);
			}
		}
	}

5.5 populateBean方法

使用populateBean方法进行属性赋值,即将bean定义中的属性值填充BeanWrapper中的bean实例中。此时如果遇到Bean A中的属性依赖Bean B这种情况,则会从尝试从缓存中获取Bean B的实例,获取不到则触发Bean B的实例化。

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
        //包装类为空
		if (bw == null) {
         //mdb中存在相关属性,即bean的属性值不为空
			if (mbd.hasPropertyValues()) {            
            //抛出异常
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
			}
			else {
				// Skip property population phase for null instance.
              //终止当前方法、
				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.
        //msb不是合成且存在InstantiationAwareBeanPostProcessors
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
              //变量beanPostProcessors
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
              //bp是InstantiationAwareBeanPostProcessor的实例
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
                //转型
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                    //终止属性注入
						return;
					}
				}
			}
		}

    //获取待注入的bean的属性值
		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
        
        
        //自动装配相关
		int resolvedAutowireMode = mbd.getResolvedAutowireMode();
       //resolvedAutowireMode为1或者2
		if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
			// Add property values based on autowire by name if applicable.
            
            //resolvedAutowireMode = 1,根据名称进行注入
			if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
				autowireByName(beanName, mbd, bw, newPvs);
			}
			// Add property values based on autowire by type if applicable.
            
          // resolvedAutowireMode = 2,根据类型进行注入
			if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
				autowireByType(beanName, mbd, bw, newPvs);
			}
           //覆盖旧的配置
			pvs = newPvs;
		}
     
           //判断InstantiationAwareBeanPostProcessors属性是否注册到工厂中
		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
        
        //是否需要检查依赖
		boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);

		PropertyDescriptor[] filteredPds = null;
      
		if (hasInstAwareBpps) {
          //属性为空
			if (pvs == null) {
            //属性赋值
				pvs = mbd.getPropertyValues();
			}
            //遍历后置处理器
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
            //判断bp是否为InstantiationAwareBeanPostProcessor的实例
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
                //转型
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                    //调用nstantiationAwareBeanPostProcessor的postProcessProperties方法
					PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
					if (pvsToUse == null) {
						if (filteredPds == null) {
                        //过滤出所有需要进行依赖检查的属性编辑器
							filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
						}
                        //调用nstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
						pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
						if (pvsToUse == null) {
							return;
						}
					}
                //对属性值pvs进行重新赋值
					pvs = pvsToUse;
				}
			}
		}
        
        //依赖检查
		if (needsDepCheck) {
			if (filteredPds == null) {
				filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
			}
			checkDependencies(beanName, mbd, filteredPds, pvs);
		}

        //属性值不为空
		if (pvs != null) {
          //将pvs包含的属性值填充给BeanWrapper中的bean实例
			applyPropertyValues(beanName, mbd, bw, pvs);
		}
	}


protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
        //省略
		MutablePropertyValues mpvs = null;
		List<PropertyValue> original;
        //pvs属于MutablePropertyValues的实例
		if (pvs instanceof MutablePropertyValues) {
        //强制转型
			mpvs = (MutablePropertyValues) pvs;
            //mpvs中是包含转换中的值
			if (mpvs.isConverted()) {
				// Shortcut: use the pre-converted values as-is.
				try {
                //添加mpvs到包装类中
					bw.setPropertyValues(mpvs);
                   //返回
					return;
				}
				catch (BeansException ex) {            
					throw new BeanCreationException(
							mbd.getResourceDescription(), beanName, "Error setting property values", ex);
				}
			}
            //mpvs中的没有包含转换的值
            //将mpvs中包含的属性信息赋值给original
			original = mpvs.getPropertyValueList();
		}
		else {
             //pvs不属于MutablePropertyValues的实例
               //将pvs中包含的属性信息赋值给original
			original = Arrays.asList(pvs.getPropertyValues());
		}
        
               
        //获取用户自定义类型转换器
		TypeConverter converter = getCustomTypeConverter();
		if (converter == null) {
			converter = bw;
		}
        
        //创建BeanDefinitionValueResolver解析器
		BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);

		// Create a deep copy, resolving any references for values.
        //存放实际解析后的属性值
		List<PropertyValue> deepCopy = new ArrayList<>(original.size());
		boolean resolveNecessary = false;
        //遍历原始属性
		for (PropertyValue pv : original) {
          //已经转换
			if (pv.isConverted()) {
            //添加到deepCopy中
				deepCopy.add(pv);
			}
			else {
            //原始属性名
				String propertyName = pv.getName();
              //原始属性值
				Object originalValue = pv.getValue();
                
                //解析并获取实际的属性值,添加到deepCopy容器中
				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);
				}
                
                
                //使用解析器解析原始属性值,获取依赖的bean对象
				Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
                
				Object convertedValue = resolvedValue;
				boolean convertible = bw.isWritableProperty(propertyName) &&
						!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
				if (convertible) {
					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.
				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标记为已经转换过
			mpvs.setConverted();
		}

		// Set our (possibly massaged) deep copy.
		try {
        //使用deepCopy构造MutablePropertyValues对象并填充到BeanWrapper中
    
			bw.setPropertyValues(new MutablePropertyValues(deepCopy));
		}
		catch (BeansException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Error setting property values", ex);
		}
	}
 

    public Object resolveValueIfNecessary(Object argName, @Nullable Object value) {
		// We must check each value to see whether it requires a runtime reference
		// to another bean to be resolved.
		if (value instanceof RuntimeBeanReference) {
        //RuntimeBeanReferences是用于属性值对象不可变的占位符类,,当它对工厂中另一个 bean存在引用时,将在运行时解析        
			RuntimeBeanReference ref = (RuntimeBeanReference) value;
			return resolveReference(argName, ref);
		}
	   //省略
	}


      //这个方法主要是解析当前Bean A中存在对另外一个Bean B的引用,如果Bean B不存在缓存中,则调用Bean B的实例化;如果Bean B存在缓存中,则直接返回
      //解决了Bean之间的循环依赖
	private Object resolveReference(Object argName, RuntimeBeanReference ref) {
		try {
			Object bean;
            //引用Bean B的类型
			Class<?> beanType = ref.getBeanType();
            //是否引用父工厂
			if (ref.isToParent()) {
            //获取父工厂
				BeanFactory parent = this.beanFactory.getParentBeanFactory();
                //父工厂为空
				if (parent == null) {
                //抛出异常,不能解析一个不可用的工厂
					throw new BeanCreationException(
							this.beanDefinition.getResourceDescription(), this.beanName,
							"Cannot resolve reference to bean " + ref +
									" in parent factory: no parent factory available");
				}
                //引用Bean B的类型不为空
				if (beanType != null) {
                //通过类型获取Bean B,如果缓存没有则触发Bean B实例化
					bean = parent.getBean(beanType);
				}
				else {
                //通过beanName从父工厂中获取Bean B,如果缓存没有则触发Bean B实例化
					bean = parent.getBean(String.valueOf(doEvaluate(ref.getBeanName())));
				}
			}
			else {   
            //没有引用父工厂
            //通过beanType或者beanName,从工厂中获取Bean的实例
            
				String resolvedName;
				if (beanType != null) {
					NamedBeanHolder<?> namedBean = this.beanFactory.resolveNamedBean(beanType);
					bean = namedBean.getBeanInstance();
					resolvedName = namedBean.getBeanName();
				}
				else {
					resolvedName = String.valueOf(doEvaluate(ref.getBeanName()));
					bean = this.beanFactory.getBean(resolvedName);
				}
                
                //注册依赖关系
				this.beanFactory.registerDependentBean(resolvedName, this.beanName);
			}
            //判断是否为空Bean
			if (bean instanceof NullBean) {
				bean = null;
			}
            //完成属性填充,返回bean对象
			return bean;
		}
		catch (BeansException ex) {
			throw new BeanCreationException(
					this.beanDefinition.getResourceDescription(), this.beanName,
					"Cannot resolve reference to bean '" + ref.getBeanName() + "' while setting " + argName, ex);
		}
	}

5.6 initializeBean方法

Bean的初始化

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
         //检测Aware相关接口并设置相关依赖
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
        //初始化之前,调用后置处理器的前置处理方法
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
        //调用初始化方法
			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()) {
         //初始化后,调用后置处理器的后置处理方法
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}

5.7 invokeAwareMethods方法

invokeAwareMethods方法执行时间在Bean对象属性注入之后,主要作用是检查Aware相关接口并设置相关依赖

	private void invokeAwareMethods(final String beanName, final Object bean) {
    
      //判断bean对象是否实现实现Aware接口
		if (bean instanceof Aware) {
          //如果实现Aware接口,则进一步判断具体属于Aware的哪个子类,调用子类接口的实现
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean).setBeanName(beanName);
			}
			if (bean instanceof BeanClassLoaderAware) {
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

5.8 applyBeanPostProcessorsBeforeInitialization方法

调用Bean后置处理器的前置处理方法postProcessBeforeInitialization。

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

		Object result = existingBean;
       //遍历后置处理器
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
        //调用后置处理器的前置处理方法
			Object current = processor.postProcessBeforeInitialization(result, beanName);
            //非空,直接返回
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}
       
    
    	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //判断bean是否属于这6中Aware子类的实例
		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) {
   // 进一步判断具体属于Aware的哪个子类,调用子类接口的实现
		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);
		}
	}

5.9 invokeInitMethods方法

protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
			throws Throwable {

        //检查bean是否实现InitializingBean接口
		boolean isInitializingBean = (bean instanceof InitializingBean);
       
       //实现InitializingBean接口 && (mbd为空 null 或者 mbd
		if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
			if (logger.isTraceEnabled()) {
				logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
			}
			if (System.getSecurityManager() != null) {
				try {
					AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
						((InitializingBean) bean).afterPropertiesSet();
						return null;
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
            //调用InitializingBean接口实现类的afterPropertiesSet实现方法
				((InitializingBean) bean).afterPropertiesSet();
			}
		}

        //mbd不为空  && bean的类型不为 NullBean
		if (mbd != null && bean.getClass() != NullBean.class) {
        //获取初始化方法
        //init-method属性中配置的名称
			String initMethodName = mbd.getInitMethodName();
			if (StringUtils.hasLength(initMethodName) &&
					!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {
				invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	}

5.10 invokeCustomInitMethod方法

检查是否配置有自定义得init-method,如果有则调用初始化方法

protected void invokeCustomInitMethod(String beanName, final Object bean, RootBeanDefinition mbd)
			throws Throwable {

    //获取初始化方法名称
		String initMethodName = mbd.getInitMethodName();
		Assert.state(initMethodName != null, "No init method set");
        
        //通过bean得类型和方法名,获取到待执行得方法/Method
		Method initMethod = (mbd.isNonPublicAccessAllowed() ?
				BeanUtils.findMethod(bean.getClass(), initMethodName) :
				ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName));

         //获取不到方法
		if (initMethod == null) {
           //如果配置文件中已经配置该方法,则抛出异常
			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);

		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();
			}
		}
	}

5.11 applyBeanPostProcessorsAfterInitialization方法

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

		Object result = existingBean;
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
          //调用BeanPostProcessor的后置处理方法
			Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}

5.12 registerDisposableBeanIfNecessary

protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {
		AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);
        //  mdb非原型 && bean对象需要在关闭时销毁
		if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {
        //单例
			if (mbd.isSingleton()) {
				// Register a DisposableBean implementation that performs all destruction
				// work for the given bean: DestructionAwareBeanPostProcessors,
				// DisposableBean interface, custom destroy method.
                //使用DisposableBean接口的实现类DisposableBeanAdapter包装需要销毁的bean对象,以beanName为键,DisposableBean为值注册到disposableBeans容器中
                /
				registerDisposableBean(beanName,
						new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
			}
			else {
				// A bean with a custom scope...
                //非单例条件下,自定义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));
			}
		}
	}
    
    
    protected boolean requiresDestruction(Object bean, RootBeanDefinition mbd) {
    
    //bean是否为空bean && (是否拥有销毁方法  || (是否注册Destruction AwareBeanPostProcessor到工厂中 &&  检查给定的bean是否有适配它的DestructionAwareBeanPostProcessor处理器)
		return (bean.getClass() != NullBean.class &&
				(DisposableBeanAdapter.hasDestroyMethod(bean, mbd) || (hasDestructionAwareBeanPostProcessors() &&
						DisposableBeanAdapter.hasApplicableProcessors(bean, getBeanPostProcessors()))));
	}
    
    
    
    //判断当前bean是否用于销毁方法
    public static boolean hasDestroyMethod(Object bean, RootBeanDefinition beanDefinition) {
      //检查是否实现DisposableBean或者AutoCloseable接口
		if (bean instanceof DisposableBean || bean instanceof AutoCloseable) {
			return true;
		}
        //获取销毁方法的名称
		String destroyMethodName = beanDefinition.getDestroyMethodName();
        
        //如果销毁方法的名称等于"(inferred)",则推测是否存在销毁方法
		if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName)) {
        //判断ban对象中是否存在名为close或者shutdown的方法
			return (ClassUtils.hasMethod(bean.getClass(), CLOSE_METHOD_NAME) ||
					ClassUtils.hasMethod(bean.getClass(), SHUTDOWN_METHOD_NAME));
		}
        
        //判断销毁方法的名称长度是否大于1,即有销毁方法
		return StringUtils.hasLength(destroyMethodName);
	}



   private List<DestructionAwareBeanPostProcessor> beanPostProcessors;

	public DisposableBeanAdapter(Object bean, String beanName, RootBeanDefinition beanDefinition,
		...//省略
       
       //过滤出实现DestructionAwareBeanPostProcessor接口的后置处理器,并注册到beanPostProcessors容器中
		this.beanPostProcessors = filterPostProcessors(postProcessors, bean);
	}


private List<DestructionAwareBeanPostProcessor> filterPostProcessors(List<BeanPostProcessor> processors, Object bean) {
		List<DestructionAwareBeanPostProcessor> filteredPostProcessors = null;
		if (!CollectionUtils.isEmpty(processors)) {
			filteredPostProcessors = new ArrayList<>(processors.size());
			for (BeanPostProcessor processor : processors) {
          
           //判断是否实现DestructionAwareBeanPostProcessor接口
				if (processor instanceof DestructionAwareBeanPostProcessor) {
                //转型
					DestructionAwareBeanPostProcessor dabpp = (DestructionAwareBeanPostProcessor) processor;
                    //requiresDestruction默认返回true
					if (dabpp.requiresDestruction(bean)) {
                    //将实现DestructionAwareBeanPostProcessor接口的后置处理器添加到filteredPostProcessors
						filteredPostProcessors.add(dabpp);
					}
				}
			}
		}
		return filteredPostProcessors;
	}

六 参考文献

1)JDK7在线文档
https://tool.oschina.net/apidocs/apidoc?api=jdk_7u4
2) JDK8在线文档
https://docs.oracle.com/javase/8/docs/api/
3)Spring Framework 5 中文文档
https://www.cntofu.com/book/95/index.html
4) Bruce Eckel. Java编程思想,第4版,2007,机械工业出版社
5)方腾飞,魏鹏,程晓明. Java并发编程的艺术,第1版,2015年,机械工业出版社
6)克雷格.沃斯. Spring实战,第5版,2020年,人民邮电出版社

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值