Spring源码情操陶冶-AbstractApplicationContext#invokeBeanFactoryPostProcessors
2017-04-25 18:17
671 查看
阅读源码有利于陶冶情操,承接前文Spring源码情操陶冶-AbstractApplicationContext#postProcessBeanFactory
约定:web.xml中配置的
contextClass为
XmlWebApplicationContext
瞧瞧官方注释
/** * Instantiate and invoke all registered BeanFactoryPostProcessor beans, * respecting explicit order if given. * <p>Must be called before singleton instantiation.必须在单例实例化前调用 */
主要是实例化和调用所有已注册的BeanFactoryPostProcessors beans
源码简析
对应的代码清单如下//通过一个委托类来处理实例化调用 protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); }
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
简单的看下委托类中的此方法源码,代码清单如下public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // 第一步,Invoke BeanDefinitionRegistryPostProcessors first, if any. Set<String> processedBeans = new HashSet<String>(); //条件满足 if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>(); List<BeanDefinitionRegistryPostProcessor> registryPostProcessors = new LinkedList<BeanDefinitionRegistryPostProcessor>(); //刚开始进来beanFactoryPostProcessors为空 for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { //BeanDefinitionRegistryPostProcessor目前该接口的实现者为MapperScannerConfigurer/ConfigurationClassPostProcessor if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { BeanDefinitionRegistryPostProcessor registryPostProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; //调用postProcessBeanDefinitionRegistry接口,比如MapperScannerConfigurer则会进行扫描注册接口bean操作 registryPostProcessor.postProcessBeanDefinitionRegistry(registry); registryPostProcessors.add(registryPostProcessor); } else { regularPostProcessors.add(postProcessor); } } // Do not initialize FactoryBeans here: We need to leave all regular beans // uninitialized to let the bean factory post-processors apply to them! // Separate between BeanDefinitionRegistryPostProcessors that implement // PriorityOrdered, Ordered, and the rest. //寻找实现了BeanDefinitionRegistryPostProcessor接口类的beans String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.这里只有ConfigurationClassPostProcessor类才操作 List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } *** 省略部分代码 *** // Now, invoke the postProcessBeanFactory callback of all processors handled so far. invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { // Invoke factory processors registered with the context instance. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } //第二步,处理注册在bean工厂中BeanFactoryPostProcessor接口实现类并调用公用的方法,比如PropertyResourceConfigurer资源文件解析类 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); // Separate between BeanFactoryPostProcessors that implement PriorityOrdered, // Ordered, and the rest. 执行的优先权 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)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } *** 省略部分代码 *** }
主要功能是对实现BeanFactoryPostProcessor的bean类进行调用公共接口方法
postProcessBeanFactory,并相关的信息可关联至
ConfigurableListableBeanFactorybeanFactory。常见的使用类为PropertyPlaceholderConfigurer文件解析类、MapperScannerConfigurer SQL接口注册类。公共接口的调用前者会对每个bean对象含有
${}进行解析替换,后者会注册mapper class接口类并尝试解析注解
下节预告
Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors
相关文章推荐
- Spring源码情操陶冶-AbstractApplicationContext#postProcessBeanFactory
- Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors
- Spring源码情操陶冶-AbstractApplicationContext#finishBeanFactoryInitialization
- Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory
- Spring源码情操陶冶-AbstractApplicationContext#prepareBeanFactory
- AbstractApplicationContext.invokeBeanFactoryPostProcessors()
- Spring源码情操陶冶-AbstractApplicationContext#onRefresh
- Spring源码情操陶冶-AbstractApplicationContext#initApplicationEventMulticaster
- Spring源码情操陶冶-AbstractApplicationContext#finishRefresh
- Spring源码情操陶冶-AbstractApplicationContext#prepareRefresh
- Spring源码情操陶冶-AbstractApplicationContext#registerListeners
- Spring源码情操陶冶-AbstractApplicationContext
- Spring源码情操陶冶-AbstractApplicationContext#initMessageSource
- Spring IOC/BeanFactory/ApplicationContext的工作流程/实现原理/初始化/依赖注入源码详解
- Spring启动研究2.AbstractApplicationContext.obtainFreshBeanFactory()研究
- [学习笔记] Spring beanfactory applicationcontext
- 码农小汪-spring框架学习之2-spring IoC and Beans 控制反转 依赖注入 ApplicationContext BeanFactory
- Spring 源码梳理(四) BeanFactoryPostProcessor
- Spring源码情操陶冶-ContextLoaderListener