Spring自问自答系列1----BeanFactoryPostProcessor与BeanPostProcessor的区别

BeanFactoryProcessorBeanPostProcessor貌似能够控制Bean的实例化过程,本文将讲解二者的概念和区别。java

什么是BeanFactoryPostProcessor

BeanFactoryPostProcessor源代码以下:spring

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

BeanFactoryPostProcessor是对BeanFactory级别的处理,是针对整个Bean的工厂进行处理。 若是使用自定义BeanFactoryProcessor,执行路径以下:app

org.springframework.context.support.AbstractApplicationContext#refresh
    org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors
        org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List<org.springframework.beans.factory.config.BeanFactoryPostProcessor>)
            org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(java.util.Collection<? extends org.springframework.beans.factory.config.BeanFactoryPostProcessor>, org.springframework.beans.factory.config.ConfigurableListableBeanFactory)
                org.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory
                    com.jackwu.spring.config.customBeanFactoryPostProcessor#postProcessBeanFactory

什么是BeanPostProcessor

BeanPostProcessor源代码以下:post

public interface BeanPostProcessor {
	Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

postProcessBeforeInitialization方法做用于bean初始化以前,postProcessBeforeInitialization方法做用于bean初始化以后。code

postProcessBeforeInitialization执行流程以下:接口

org.springframework.context.support.AbstractApplicationContext#refresh
    org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
        org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons
            org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
                org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
                    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
                        org.springframework.beans.factory.ObjectFactory#getObject
                            org.springframework.beans.factory.support.AbstractBeanFactory#createBean
                                org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
                                    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
                                        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
                                          org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization

AbstractAutowireCapableBeanFactory.java关键代码以下:ip

Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
    // 执行postProcessBeforeInitialization
	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()) {
    // 执行postProcessAfterInitialization
    wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}

二者区别

以上两种都为Spring提供的后处理bean的接口,只是二者执行的时机不同。前者为实例化(instantialize)以后,后者是实例化以前。功能上,后者对bean的处理功能更增强大。get

相关文章
相关标签/搜索