Dubbo中@Service工做过程解析

Dubbo中@Service工做过程解析

Spring中的BeanPostProcessor

首先咱们应当了解到在spring体系中BeanPostProcessor是什么、加载流程java

它是什么

BeanPostProcessor也也称为后置处理器。在spring容加载流程。spring

spring容器bean加载流程
// 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的实现类的beforexxxxafterxxx的方法来作进一步的处理。post

有了以上基础,就能够去dubbo包中找到各自的xxxBeanPostProcessor了。
dubbo中提供的各个beanpostprocessorthis

dubbo中的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的处理过程。继承

  1. 扫描系统配置的 basePackages,将@Service注解的类放到一个set集合中。
  2. 找到全部标注@Service的类是否被扫面到。
  3. registerServiceBean循环遍历这个集合,并将它们注入到spring容器中。
相关文章
相关标签/搜索