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<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
        List<String> orderedPostProcessorNames = new ArrayList<String>();
        List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
        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<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值