Dubbo2.7详解( 三 )

6)单个DubboConfigBindingBeanPostProcessor的展示(删减掉部分不怎么用到的)
public class DubboConfigBindingBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware, InitializingBean, BeanDefinitionRegistryPostProcessor {private final String prefix;private final String beanName;private DubboConfigBinder dubboConfigBinder;....private List<DubboConfigBeanCustomizer> configBeanCustomizers = Collections.emptyList();....@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 每个XxConfig对应一个BeanPostProcessor , 所以每个DubboConfigBindingBeanPostProcessor只处理对应的beanNameif (this.beanName.equals(beanName) && bean instanceof AbstractConfig) {AbstractConfig dubboConfig = (AbstractConfig) bean;// 从properties文件中获取值,并设置到dubboConfig对象中bind(prefix, dubboConfig);// 设置dubboConfig对象的name属性,设置为beanNamecustomize(beanName, dubboConfig);}return bean;}private void bind(String prefix, AbstractConfig dubboConfig) {dubboConfigBinder.bind(prefix, dubboConfig);if (log.isInfoEnabled()) {log.info(...);}}private void customize(String beanName, AbstractConfig dubboConfig) {for (DubboConfigBeanCustomizer customizer : configBeanCustomizers) {customizer.customize(beanName, dubboConfig);}}...@Overridepublic void afterPropertiesSet() throws Exception {initDubboConfigBinder();// 创建DefaultDubboConfigBinderinitConfigBeanCustomizers();}private void initDubboConfigBinder() {if (dubboConfigBinder == null) {try {// 先从Spring容器中获取DubboConfigBinder,默认获取不到dubboConfigBinder = applicationContext.getBean(DubboConfigBinder.class);} catch (BeansException ignored) {if (log.isDebugEnabled()) {log.debug("DubboConfigBinder Bean can't be found in ApplicationContext.");}// Use Default implementation// 生成一个默认的dubboConfigBinder = createDubboConfigBinder(applicationContext.getEnvironment());}}dubboConfigBinder.setIgnoreUnknownFields(ignoreUnknownFields);dubboConfigBinder.setIgnoreInvalidFields(ignoreInvalidFields);}private void initConfigBeanCustomizers() {// 得到之前创建了的NamePropertyDefaultValueDubboConfigBeanCustomizerCollection<DubboConfigBeanCustomizer> configBeanCustomizers = beansOfTypeIncludingAncestors(applicationContext, DubboConfigBeanCustomizer.class).values();this.configBeanCustomizers = new ArrayList<>(configBeanCustomizers);AnnotationAwareOrderComparator.sort(this.configBeanCustomizers);}...}【3】注解@DubboComponentScan
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(DubboComponentScanRegistrar.class)public @interface DubboComponentScan {String[] value() default {};String[] basePackages() default {};Class<?>[] basePackageClasses() default {};}1)导入的DubboComponentScanRegistrar类做了什么
/又是利用了实现了ImportBeanDefinitionRegistrar接口,在实例化该类会调用其registerBeanDefinitions方法;public class DubboComponentScanRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {//执行DubboComponentScanRegistrar// 拿到DubboComponentScan注解所定义的包路径,扫描该package下的类,识别这些类上Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);// 注册ServiceAnnotationBeanPostProcessor一个Bean// 实现了BeanDefinitionRegistryPostProcessor接口,所以在Spring启动时会调用postProcessBeanDefinitionRegistry方法// 该方法会进行扫描,扫描@Service注解了的类,然后生成BeanDefinition(会生成两个,一个普通的bean,一个ServiceBean),后续的Spring周期中会生成Bean// 在ServiceBean中会监听ContextRefreshedEvent事件,一旦Spring启动完后 , 就会进行服务导出registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);// 注册ReferenceAnnotationBeanPostProcessor// 实现了AnnotationInjectedBeanPostProcessor接口 , 继而实现了InstantiationAwareBeanPostProcessorAdapter接口// 所以Spring在启动时,在对属性进行注入时会调用AnnotationInjectedBeanPostProcessor接口中的postProcessPropertyValues方法// 在这个过程中会按照@Refrence注解的信息去生成一个RefrenceBean对象registerReferenceAnnotationBeanPostProcessor(registry);}//核心方法1,注册一个对@Service注解处理的 BeanDefinitionRegistryPostProcessorprivate void registerServiceAnnotationBeanPostProcessor(Set<String> packagesToScan, BeanDefinitionRegistry registry) {// 生成一个RootBeanDefinition,对应的beanClass为ServiceAnnotationBeanPostProcessor.classBeanDefinitionBuilder builder = rootBeanDefinition(ServiceAnnotationBeanPostProcessor.class);// 将包路径作为在构造ServiceAnnotationBeanPostProcessor时调用构造方法时的传入参数builder.addConstructorArgValue(packagesToScan);builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry);}//核心方法2,注册一个对属性赋值处理的AnnotationInjectedBeanPostProcessor且带有ApplicationListener事件监听功能private void registerReferenceAnnotationBeanPostProcessor(BeanDefinitionRegistry registry) {// Register @Reference Annotation Bean Processor// 注册一个ReferenceAnnotationBeanPostProcessor做为bean,ReferenceAnnotationBeanPostProcessor是一个BeanPostProcessorBeanRegistrar.registerInfrastructureBean(registry,ReferenceAnnotationBeanPostProcessor.BEAN_NAME, ReferenceAnnotationBeanPostProcessor.class);}private Set<String> getPackagesToScan(AnnotationMetadata metadata) {AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(DubboComponentScan.class.getName()));String[] basePackages = attributes.getStringArray("basePackages");Class<?>[] basePackageClasses = attributes.getClassArray("basePackageClasses");String[] value = https://www.huyubaike.com/biancheng/attributes.getStringArray("value");// Appends value array attributesSet<String> packagesToScan = new LinkedHashSet<String>(Arrays.asList(value));packagesToScan.addAll(Arrays.asList(basePackages));for (Class<?> basePackageClass : basePackageClasses) {packagesToScan.add(ClassUtils.getPackageName(basePackageClass));}if (packagesToScan.isEmpty()) {return Collections.singleton(ClassUtils.getPackageName(metadata.getClassName()));}return packagesToScan;}}

推荐阅读