Spring源码学习--BeanFactoryPostProcessor

和BeanPostProcessor原理一致,Spring提供了对BeanFactory进行操作的处理器BeanFactoryProcessor,简单来说就是获取容器BeanFactory,这样就可以在真正初始化bean之前对bean做一些处理操作。
BeanFactoryPostProcessor接口源码:
public interface BeanFactoryPostProcessor {

    //获取beanFactory,这样在真正使用容器之前可以对一些bean做一些初始化操作
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}
简单示例:
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        //获取BeanDefinition 
        GenericBeanDefinition rootBeanDefinition = (GenericBeanDefinition) beanFactory.getBeanDefinition("transaction");
        //将bean设置出延迟初始化
        rootBeanDefinition.setLazyInit(true);
        System.err.println(rootBeanDefinition.getInitMethodName());
    }

}
示例的功能是在bean初始化之前修改bean的属性配置。
接下来我们介绍一下BeanFactoryPostProcessor的初始化和调用机制。
(1)BeanFactoryPostProcessor和普通的bean一样注册到spring容器中。
(2)获取所有的BeanFactoryPostProcessor类型的类并初始化,添加到列表中
(3)在列表中循环执行所有的BeanFactoryPostProcessor实现类。

起始执行点在AbstractApplicationContext中,invokeBeanFactoryPostProcessors(beanFactory)执行是在初始化Bean实体方法finishBeanFactoryInitialization(beanFactory)之前,这样就可以在初始化bean之前可以对一些bean做一些额外的处理操作。
invokeBeanFactoryPostProcessors(beanFactory);
执行 BeanFactoryPostProcessor所有的实现类
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        //执行BeanFactoryPostProcessor所有的实现类
        PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

        // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
        // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
        if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }
    }
PostProcessorRegistrationDelegate类的 invokeBeanFactoryPostProcessors方法中如下操作
获取所有BeanFactoryPostProcessor的子类
String[] postProcessorNames =
                beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
从Spring的容器中获取所有的 BeanFactoryPostProcessor实现类,添加到priorityOrderedPostProcessors 中
List priorityOrderedPostProcessors = new ArrayList();
        List orderedPostProcessorNames = new ArrayList();
        List nonOrderedPostProcessorNames = new ArrayList();
        for (String ppName : postProcessorNames) {
            if (processedBeans.contains(ppName)) {
                // skip - already processed in first phase above
            }
            else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                //从Spring的容器中获取所有的BeanFactoryPostProcessor实现类,添加到priorityOrderedPostProcessors 中
                priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
            }
            else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                orderedPostProcessorNames.add(ppName);
            }
            else {
                nonOrderedPostProcessorNames.add(ppName);
            }
        }
执行所有的 BeanFactoryPostProcessor的实现类
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
遍历执行所有的BeanFactoryPostProcessor的实现类
private static void invokeBeanFactoryPostProcessors(
            Collection postProcessors, ConfigurableListableBeanFactory beanFactory) {

        for (BeanFactoryPostProcessor postProcessor : postProcessors) {
            postProcessor.postProcessBeanFactory(beanFactory);
        }
    }






你可能感兴趣的:(spring入门及源码学习,Spring入门及源码学习)