BeanPostProcessor
首先咱们应当了解到在spring体系中BeanPostProcessor
是什么、加载流程java
BeanPostProcessor
也也称为后置处理器。在spring容加载流程。spring
// Prepare this context for refreshing. prepareRefresh(); // 获取beanFactory并加载容器中定义的bean信息 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // 归类bean工厂的后置处理器 postProcessBeanFactory(beanFactory); // 处理这些bean工厂的后置处理器 invokeBeanFactoryPostProcessors(beanFactory); // 调用全部实现了beanpostprocessor接口的类。(先加载实现了priority接口的,而后加载order的,最后加载剩余的) registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); }
因此由上能够看出,在registerBeanPostProcessors
这一步的时候会划分容器中各类后置处理器,首先归类有@Priority
注解,其次归类有@Order
注解。最后划分其它的。ide
// 1 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 2 sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, orderedPostProcessors); // 3 registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); // Finally, re-register all internal BeanPostProcessors. sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors);
这样,就将全部的后置处理器注册到容器中。后续在容器启动的过程当中,会经过反射的方式调用各个实现了BeanPostProcessor
的实现类的beforexxxx
和afterxxx
的方法来作进一步的处理。post
有了以上基础,就能够去dubbo包中找到各自的
xxxBeanPostProcessor
了。
this
ServiceAnnotationBeanPostProcessor
BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,是一种比较特殊的BeanFactoryPostProcessor。BeanDefinitionRegistryPostProcessor中定义的postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)方法 能够让咱们实现自定义的注册bean定义的逻辑。
code
从以上论述能够看出实现BeanDefinitionRegistryPostProcessor
的做用就是向spring容器中注册响应的bean实例。blog
@Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // 读取配置中声明的dubbo扫描类 Set<String> resolvedPackagesToScan = resolvePackagesToScan(packagesToScan); if (!CollectionUtils.isEmpty(resolvedPackagesToScan)) { // 将加有@Service注解的类注册到spring容器中 registerServiceBeans(resolvedPackagesToScan, registry); } else { if (logger.isWarnEnabled()) { logger.warn("packagesToScan is empty , ServiceBean registry will be ignored!"); } } }
下面就分析registerServiceBeans
的处理过程。继承
basePackages
,将@Service
注解的类放到一个set集合中。@Service
的类是否被扫面到。registerServiceBean
循环遍历这个集合,并将它们注入到spring容器中。