spring源码解析(3)

1.AnnotationConfigApplicationContext,ClassPathXmlApplicationContext  创建beanFactory的时机不一样。

AnnotationConfigApplicationContext,在容器启动之前就创建beanFactory

public GenericApplicationContext() {
   this.beanFactory = new DefaultListableBeanFactory();
}

  

ClassPathXmlApplicationContext  ,调refresh()后,即容器启动过程中创建beanFactory

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

> refreshBeanFactory(); // AbstractApplicationContext#refreshBeanFactory

先创建DefaultListableBeanFactory实例,然后 解析xml配置文件,注册bean到beanFactory,最后再将beanFactory赋值给容器

DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
// 定制beanFactory,设置参数
customizeBeanFactory(beanFactory);
// 注册spring的xml配置的bean到beanFactory,此时容器还未指定beanbeanFactory
loadBeanDefinitions(beanFactory);
// 给容器指定beanFactory
synchronized (this.beanFactoryMonitor) {
   this.beanFactory = beanFactory;
}

  

	// Tell the subclass to refresh the internal bean factory.
			// 获得刷新的beanFactory
			// 对于AnnotationConfigApplicationContext,作用:
			// 1.调用org.springframework.context.support.GenericApplicationContext.refreshBeanFactory,
			// 只是指定了SerializationId
			// 2.直接返回beanFactory(不用创建,容器中已存在)
			//  对于ClassPathXmlApplicationContext,作用:
			// 1.调用AbstractRefreshableApplicationContext.refreshBeanFactory
			// 2.如果存在beanFactory,先销毁单例bean,关闭beanFactory,再创建beanFactory
			// 3.注册传入的spring的xml配置文件中配置的bean,注册到beanFactory
			// 4.将beanFactory赋值给容器,返回beanFactory
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

  

// Invoke factory processors registered as beans in the context.
				// 1.通过beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)
				//   拿到ConfigurationClassPostProcessor
				// 2.通过ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry,注册所有注解配置的bean
                    (在这个后置处理器中,对beanDefinition进行遍历,就是spring默认的5个+appConfig(配置类),
                     (1)对appConfig进行full或者lite标记;
                     (2)             
      
) // 注册的顺序: @ComponentScan>实现ImportSelector>方法bean>@ImportResource("spring.xml") // > 实现 ImportBeanDefinitionRegistrar (相对的顺序,都在同一个配置类上配置) // 3. 调用ConfigurationClassPostProcessor#postProcessBeanFactory // 增强@Configuration修饰的配置类 AppConfig--->AppConfig$$EnhancerBySpringCGLIB // (可以处理内部方法bean之间的调用,防止多例) // 添加了后置处理器 ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor (new) invokeBeanFactoryPostProcessors(beanFactory);

  

doProcessConfigurationClass方法,解析注解的顺序:
1.@Component
2.@PropertySource
3.@ComponentScan(对注解的参数进行解析,解析后,对相应路径进行扫描,
// 找到@Component修饰的类的beanDefiniton集合
			Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
通过该方法把对应路径有@Component注解的类进行扫描,然后对每个类进行遍历注解中的属性(看是否有懒加载之类的属性),对有@Component注解的类,注册到容器中)

4.处理完@ComponentScan后,遍历@Import注解
5.处理@ImportResource
6.处理@Bean

====上面步骤处理完成后,只有@Component注解的类注册到容器中,
其他的扫描到之后都记录起来,在下面的
(// 注册bean
		this.registry.registerBeanDefinition(definitionHolder.getBeanName(), definitionHolder.getBeanDefinition());)
	进行注册

注册顺序:
1.@Import
2.@Bean
3.@ImportResource("spring.xml")
4.实现 ImportBeanDefinitionRegistrar的 bean 注册到容器

  加载完BeanDeifinition之后,进行实例化

	// 实例化所有剩余的(非懒加载)单例。
				finishBeanFactoryInitialization(beanFactory);

  遍历每一个BeanDeifinition,如果不是抽象的,是单例的,不是懒加载的,

  就去判断是否为FactoryBean

for (String beanName : beanNames) {
 			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
 			//不是抽象的,是单例的,不是懒加载的
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				if (isFactoryBean(beanName)) {
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final 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) {
							getBean(beanName);
						}
					}
				}
				else {
					getBean(beanName);
				}
			}
		}

  在实例化bean中,调用了很多次BeanPostProcessor bean的后置处理器

第一次调用bean的后置处理器:

// 实例化前的后置处理器调用 InstantiationAwareBeanPostProcessor
			// 第1次调用后置处理器
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

  

// 在目标对象实例化之前调用,可以返回任意类型的值,如果不为空,
					// 此时可以代替原本应该生成的目标对象实例(一般是代理对象)
					// InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);

  去循环所有的bean的后置处理器,如果是实现了InstantiationAwareBeanPostProcessor接口的bean的后置处理器,就去调用它的postProcessBeforeInstantiation的方法:

protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
				if (result != null) {
					return result;
				}
			}
		}
		return null;
	}

  如果想自定义,那么就实现InstantiationAwareBeanPostProcessor接口,例如:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

//@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

	/**
	 * BeanPostProcessor接口中的方法
	 * 在Bean的自定义初始化方法之前执行
	 * Bean对象已经存在了
	 */
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println(">>postProcessBeforeInitialization=="+bean);
		return bean;
	}

	/**
	 * BeanPostProcessor接口中的方法
	 * 在Bean的自定义初始化方法执行完成之后执行
	 * Bean对象已经存在了
	 */
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("<<postProcessAfterInitialization=="+bean);
		return bean;
	}

	/**
	 * InstantiationAwareBeanPostProcessor中自定义的方法
	 * 在方法实例化之前执行  Bean对象还没有
	 */
	@Override
	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		System.out.println("--->postProcessBeforeInstantiation=="+beanName);
		if("user".equals(beanName)){
			return new Fox();
		}
		return null;
	}

	/**
	 * InstantiationAwareBeanPostProcessor中自定义的方法
	 * 在方法实例化之后执行  Bean对象已经创建出来了
	 */
	@Override
	public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		System.out.println("<---postProcessAfterInstantiation=="+beanName);
		return true;
	}

	/**
	 * InstantiationAwareBeanPostProcessor中自定义的方法
	 * 可以用来修改Bean中属性的内容
	 */
//	@Override
//	public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
//													String beanName) throws BeansException {
//		System.out.println("<---postProcessPropertyValues--->");
//		return pvs;
//	}

}

  如果有设置object,返回后,直接调用postProcessAfterInitialization:

if (bean != null) {
						// 如果bean不为空,调用 postProcessAfterInitialization 方法,否则走正常实例化流程
						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
					}

  

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

		Object result = existingBean;
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}  

如果第一次调用后置处理器不做任何处理,就继续往下走,否则直接return。

第2次调用bean的后置处理器:

第二次调用后置处理器,是通过反射去实例化一个对象。其中包含很多内容,例如,选择构造器,选择到构造器之后,就反射创建对象,并将实例放在包装类BeanWrapper中返回。

/**
			 * 第2次调用后置处理器
			 * 创建bean实例,并将实例放在包装类BeanWrapper中返回
			 * 1.通过工厂方法创建bean实例     method.invoke(obj,args)   @Bean
			 * 2.通过构造方法自动注入创建bean实例    ctor.newInstance(args)
			 * 3.通过无参构造器创建bean实例   ctor.newInstance()
 			 */
			instanceWrapper = createBeanInstance(beanName, mbd, args);

  第3次调用bean后置处理器:处理对象中,熟悉或者方法上是否有@Autowred和@Value 的注解。

//允许后置处理器修改合并的bean定义
					// MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
					// 第3次调用后置处理器
					// AutowiredAnnotationBeanPostProcessor 解析@Autowired和@Value,封装到InjectionMetadata
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

  第4次调用bean后置处理器,将早期的bean暴露出去

// 添加到singletonFactories SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
			//第4次调用后置处理器
			// earlySingletonExposure为true,将早期的bean暴露出去
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));

  第5次调用bean后置处理器,在属性设置之前修改bean的状态

//  在属性设置之前修改bean的状态  InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
		// 第5次调用后置处理器
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					//在目标对象实例化之后调用,此时对象被实例化,但是对象的属性还未设置。如果该方法返回
					//fasle,则会忽略之后的属性设置。返回true,按正常流程设置属性值
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						continueWithPropertyPopulation = false;
						break;
					}
				}
			}
		}

  第6次调用bean后置处理器,可以在该方法内对属性值进行修改(此时属性值还未设置,但可以修改原本会设置的进去的属性值)

//InstantiationAwareBeanPostProcessor.postProcessProperties
			// 第6次调用后置处理器
			// 可以在该方法内对属性值进行修改(此时属性值还未设置,但可以修改原本会设置的进去的属性值)。
			// 如果postProcessAfterInstantiation方法返回false,该方法不会调用
			// 依赖注入逻辑
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {

					//@Autowired 属性注入逻辑
					// AutowiredAnnotationBeanPostProcessor.postProcessProperties
					//AutowiredAnnotationBeanPostProcessor.AutowiredMethodElement.inject
					//AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject
					//DefaultListableBeanFactory#resolveDependency
					//DefaultListableBeanFactory#doResolveDependency
					//DependencyDescriptor#resolveCandidate
					// 此方法直接返回 beanFactory.getBean(beanName);

					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
					if (pvsToUse == null) {
						if (filteredPds == null) {
							filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
						}
						pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
						if (pvsToUse == null) {
							return;
						}
					}
					pvs = pvsToUse;
				}
			}

  第7次调用后置处理器:

//第7次调用后置处理器
			//  如果配置了@PostConstruct  会调用
			// InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization
			//  Aware方法调用  ApplicationContextAware  EnvironmentAware    ApplicationEventPublisherAware
			//ApplicationContextAwareProcessor#postProcessBeforeInitialization
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

  第8次调用后置处理器:实现aop

//  BeanPostProcessor.postProcessAfterInitialization
			//第8次调用后置处理器
			//   aop实现:AbstractAutoProxyCreator#postProcessAfterInitialization
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

  第9次调用后置处理器:将bean注册为可以销毁

// 将bean注册为可以销毁   DestructionAwareBeanPostProcessor bean的销毁后置处理器
			// 第九次调用后置处理器
			registerDisposableBeanIfNecessary(beanName, bean, mbd);

  至此,实例化,初始化完毕

原文地址:https://www.cnblogs.com/takeyblogs/p/13955265.html