BeanFactoryProcessor
与BeanPostProcessor
貌似能够控制Bean
的实例化过程,本文将讲解二者的概念和区别。java
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
源代码以下: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