spring-BeanPostProcessor-1

spring 从扩展点说起

spring 两大功能IOC,AOP。spring的扩展如何呢?我们想在bean实例化的时候做些修改该如何做呢?在bean销毁的时候能做什么呢?AOP的代理对象是什么时候注入的?

BeanPostProcessor 接口

public interface BeanPostProcessor {

	Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

}

可以看出这个接口是定义一些在Initialization操作前后的操作,那这个接口是实现的呢?我们来看看Bean创建的流程

@Override
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// Prepare this context for refreshing.
		prepareRefresh();

		//创建出BeanFactory,解析出xml的元素成BeanDefinitions
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		//为BeanFactory设置classLoader,BeanExpressionResolver,PropertyEditorRegistrar,注册ApplicationContextAwareProcessor
		prepareBeanFactory(beanFactory);

		try {
			// Allows post-processing of the bean factory in context subclasses.
			postProcessBeanFactory(beanFactory);

			// Invoke factory processors registered as beans in the context.
			invokeBeanFactoryPostProcessors(beanFactory);

			// 实例化所有的BeanPostProcessors
			registerBeanPostProcessors(beanFactory);

			// Initialize message source for this context.
			initMessageSource();

			// Initialize event multicaster for this context.
			initApplicationEventMulticaster();

			// Initialize other special beans in specific context subclasses.
			onRefresh();

			// Check for listener beans and register them.
			registerListeners();

			// 实例化Bean
			finishBeanFactoryInitialization(beanFactory);

			// Last step: publish corresponding event.
			finishRefresh();
		}

		// 省略
	}
}

1、从AbstractAutowireCapableBeanFactory的createBean方法看

@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
	if (logger.isDebugEnabled()) {
		logger.debug("Creating instance of bean '" + beanName + "'");
	}
	RootBeanDefinition mbdToUse = mbd;

	//1.1、解析出其bean class ,若解析出错抛出CannotLoadBeanClassException异常
	Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
	if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
		mbdToUse = new RootBeanDefinition(mbd);
		mbdToUse.setBeanClass(resolvedClass);
	}

	// 1.2、做注入方法验证 ,若出错则抛出BeanDefinitionValidationException异常
	try {
		mbdToUse.prepareMethodOverrides();
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
				beanName, "Validation of method overrides failed", ex);
	}

	try {
		//1.3 执行InstantiationAwareBeanPostProcessors的前置,后置方法执行
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		if (bean != null) {
			return bean;
		}
	}
	catch (Throwable ex) {
		throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
				"BeanPostProcessor before instantiation of bean failed", ex);
	}

	Object beanInstance = doCreateBean(beanName, mbdToUse, args);
	if (logger.isDebugEnabled()) {
		logger.debug("Finished creating instance of bean '" + beanName + "'");
	}
	return beanInstance;
}

接上面的1,可以看到这里,其根据注册的InstantiationAwareBeanPostProcessors执行,其能自定义类的初始化的预处理,以及后置处理

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
	Object bean = null;
	if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
		// Make sure bean class is actually resolved at this point.
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			Class<?> targetType = determineTargetType(beanName, mbd);
			if (targetType != null) {
				//1.3.1、执行InstantiationAwareBeanPostProcessors的applyBeanPostProcessorsBeforeInstantiation方法
				bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
				if (bean != null) {
					//1.3.2、执行InstantiationAwareBeanPostProcessors的applyBeanPostProcessorsAfterInitialization
					bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
				}
			}
		}
		mbd.beforeInstantiationResolved = (bean != null);
	}
	return bean;
}

2、AbstractAutowireCapableBeanFactory的createBeanInstance方法

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
	//2.1通过BeanWrapper 实例化bean
	BeanWrapper instanceWrapper = null;
	if (mbd.isSingleton()) {
		instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
	}
	if (instanceWrapper == null) {
		instanceWrapper = createBeanInstance(beanName, mbd, args);
	}
	final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
	Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);

	// 2.2 执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法
	synchronized (mbd.postProcessingLock) {
		if (!mbd.postProcessed) {
			applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
			mbd.postProcessed = true;
		}
	}
	
	boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
			isSingletonCurrentlyInCreation(beanName));
	if (earlySingletonExposure) {
		//log省略
		addSingletonFactory(beanName, new ObjectFactory<Object>() {
			//2.3暴露出及早暴露的bean的引用,使其支持set的循环引用通过SmartInstantiationAwareBeanPostProcessor
			//的getEarlyBeanReference方法,获取一个bean的引用
			@Override
			public Object getObject() throws BeansException {
				return getEarlyBeanReference(beanName, mbd, bean);
			}
		});
	}

	// Initialize the bean instance.
	Object exposedObject = bean;
	try {
		//2.4 组装bean依赖
		populateBean(beanName, mbd, instanceWrapper);
		if (exposedObject != null) {
			//2.5 实例化bean
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
	}
	//省略异常

	if (earlySingletonExposure) {
		//2.6 触发 2.3的getObject()方法,获取bean引用
		Object earlySingletonReference = getSingleton(beanName, false);
		if (earlySingletonReference != null) {
			if (exposedObject == bean) {
				exposedObject = earlySingletonReference;
			}
			else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
				String[] dependentBeans = getDependentBeans(beanName);
				Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);
				for (String dependentBean : dependentBeans) {
					if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
						actualDependentBeans.add(dependentBean);
					}
				}
				if (!actualDependentBeans.isEmpty()) {
					throw new BeanCurrentlyInCreationException(beanName,
							"Bean with name '" + beanName + "' has been injected into other beans [" +
							StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
							"] in its raw version as part of a circular reference, but has eventually been " +
							"wrapped. This means that said other beans do not use the final version of the " +
							"bean. This is often the result of over-eager type matching - consider using " +
							"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
				}
			}
		}
	}

	// 2.7注册bean销毁方法
	try {
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	}
	catch (BeanDefinitionValidationException ex) {
		throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
	}

	return exposedObject;
}

2.4 组装依赖装配

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
	PropertyValues pvs = mbd.getPropertyValues();

	if (bw == null) {
		if (!pvs.isEmpty()) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
		}
		else {
			// Skip property population phase for null instance.
			return;
		}
	}

	
	boolean continueWithPropertyPopulation = true;

	//2.4.1 执行 InstantiationAwareBeanPostProcessor 扩展点,执行自定义装配流程
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
					continueWithPropertyPopulation = false;
					break;
				}
			}
		}
	}

	if (!continueWithPropertyPopulation) {
		return;
	}

	if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
			mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
		MutablePropertyValues newPvs = new MutablePropertyValues(pvs);

		//2.4.2 执行自动装配 by name/type
		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
			autowireByName(beanName, mbd, bw, newPvs);
		}

		// Add property values based on autowire by type if applicable.
		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
			autowireByType(beanName, mbd, bw, newPvs);
		}

		pvs = newPvs;
	}

	boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
	boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);

	2.4.3 执行 InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
	if (hasInstAwareBpps || needsDepCheck) {
		PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
		if (hasInstAwareBpps) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
					if (pvs == null) {
						return;
					}
				}
			}
		}
		//2.4.4 执行依赖检查
		if (needsDepCheck) {
			checkDependencies(beanName, mbd, filteredPds, pvs);
		}
	}

	//2.4.5执行 依赖注入
	applyPropertyValues(beanName, mbd, bw, pvs);
}

2.5 执行bean实例化

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
	if (System.getSecurityManager() != null) {
		AccessController.doPrivileged(new PrivilegedAction<Object>() {
			@Override
			public Object run() {
				invokeAwareMethods(beanName, bean);
				return null;
			}
		}, getAccessControlContext());
	}
	else {
		//2.5.1 调用Aware接口注入,BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
		invokeAwareMethods(beanName, bean);
	}

	Object wrappedBean = bean;
	//2.5.2 执行BeanPostProccessor的postProcessBeforeInitialization方法
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}

	try {
		//2.5.3执行InitializingBean的afterPropertiesSet方法,和定义的init-method
		invokeInitMethods(beanName, wrappedBean, mbd);
	}
	catch (Throwable ex) {
		throw new BeanCreationException(
				(mbd != null ? mbd.getResourceDescription() : null),
				beanName, "Invocation of init method failed", ex);
	}

	//2.5.4 执行执行BeanPostProccessor的postProcessAfterInitialization方法
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}
	return wrappedBean;
}

Bean 实例化流程总结

1、AbstractAutowireCapableBeanFactory的createBean()

1.1 Class<?> resolvedClass = resolveBeanClass(mbd, beanName); 解析出bean的class,若失败则抛出CannotLoadBeanClassException异常

1.2 mbdToUse.prepareMethodOverrides(); 准备和验证方法注入,出错则抛出BeanDefinitionValidationException异常

1.3 Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 此处只执行InstantiationAwareBeanPostProcessor类型的 BeanPostProcessor的bean
执行InstantiationAwareBeanPostProcessor的预处理方法postProcessBeforeInstantiation的方法,若返回值不是Null,则继续执行postProcessAfterInitialization方法,
若此处返回的bean不是null则不进行后续操作 (第一个BeanPostProcessor的扩展点)

2、AbstractAutowireCapableBeanFactory的doCreateBean(String beanName, RootBeanDefinition mbd, Object[] args)方法

2.1 createBeanInstance 实例化bean

2.1.1通过工厂方法实例化instantiateUsingFactoryMethod(beanName, mbd, args);
2.1.2构造器实例化
	2.1.2.1 如果之前已经解析过构造器,有参调用autowireConstructor实例化,无参则调用instantiateBean实例化

	2.1.2.2 如果没有解析过构造器,则通过SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors解析出构造器,(第二个扩展点)
	若返回值不为null,则调用autowireConstructor实例化,此处会调用AutowiredAnnotationBeanPostProcessor实现将自动扫描通过@Autowired/@Value
	注解的构造器从而可以完成构造器注入

2.2 执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法(第三个扩展点)

2.3 暴露出及早暴露的bean的引用,使其支持set的循环引用通过SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法,获取一个bean的引用(第四个扩展点)

2.4 populateBean(beanName, mbd, instanceWrapper); 组装bean依赖

2.4.1 InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation() 方法(第五个扩展点),自动装配前的检查,如果返回是false则下面的都不会执行

2.4.2 autowireByName,autowireByType 的自动装配

2.4.3 InstantiationAwareBeanPostProcessor的 postProcessPropertyValues() 方法(第六个扩展点),完成一些定制化的注入,
如AutowiredAnnotationBeanPostProcessor执行@Autowired注解注入,CommonAnnotationBeanPostProcessor执行@Resource等注解的注入,
PersistenceAnnotationBeanPostProcessor执行@ PersistenceContext等JPA注解的注入,RequiredAnnotationBeanPostProcessor执行@ Required注解的检查等等

2.4.4 checkDependencies(beanName, mbd, filteredPds, pvs) 依赖检查

2.4.5 applyPropertyValues(beanName, mbd, bw, pvs); 执行 set 注入

2.5 exposedObject = initializeBean(beanName, exposedObject, mbd);初始化bean 流程

2.5.1 invokeAwareMethods(beanName, bean); 执行Aware接口入参 BeanNameAware,BeanClassLoaderAware,BeanFactoryAware

2.5.2 执行BeanPostProcessor 的postProcessBeforeInitialization 方法 (第七扩展点) 
在调用初始化之前完成一些定制的初始化任务,如BeanValidationPostProcessor完成JSR-303 @Valid注解Bean验证,
InitDestroyAnnotationBeanPostProcessor完成@PostConstruct注解的初始化方法调用,
ApplicationContextAwareProcessor完成一些Aware接口的注入(如EnvironmentAware、ResourceLoaderAware、ApplicationContextAware),其返回值将替代原始的Bean对象

2.5.3 invokeInitMethods(beanName, wrappedBean, mbd);

	2.5.3.1 执行InitializingBean接口的afterPropertiesSet()初始化方法,已经xml定义的init-method方法

2.5.4 执行BeanPostProcessor的postProcessAfterInitialization 方法(第八个扩展点)
第八个扩展点,AspectJAwareAdvisorAutoProxyCreator(完成xml风格的AOP配置(<aop:config>)
的目标对象包装到AOP代理对象)、AnnotationAwareAspectJAutoProxyCreator(完成@Aspectj注解风格(<aop:aspectj-autoproxy> 
@Aspect)的AOP配置的目标对象包装到AOP代理对象),其返回值将替代原始的Bean对象

2.7注册bean销毁方法

registerDisposableBeanIfNecessary(beanName, bean, mbd); 注册单例bean的销毁流程

2.7.1 DestructionAwareBeanPostProcessor的postProcessBeforeDestruction (第九个扩展点),DisposableBean的destroy:注册/调用DisposableBean的destroy销毁方法
通过xml指定的自定义destroy-method : 注册/调用通过XML指定的destroy-method销毁方法,Scope的registerDestructionCallback:注册自定义的Scope的销毁回调方法。
posted on 2016-03-25 13:53  liaozq  阅读(483)  评论(0编辑  收藏  举报