本文共 2570 字,大约阅读时间需要 8 分钟。
1@Service注解的实现流程
2@Reference注解的实现流程 DemoService 一个服务生成两个bean 1)DemoServiceImpl ---> demoServiceImplBean(普通) 2)根据DemoServiceImpl上的@Service注解生成一个serviceBean,这个bean的ref属性指向demoServiceImpl这个bean。serviceBean还实现了ApplicationListener<ContenxtRefreshEvent>接口 @EnableDubboConfig : -----> 解析配置-----> 生成不同的配置bean ---->为每个bean注册一个空的BeanDefinition,为每个bean注册一个DubboConfigBindingBeanPostProcessor(从配置文件获取值设置到属性上)的bean后置处理器 主要用来解析配置,properties文件中的配置 1)根据配置生成bean dubbo.application ---> ApplicationConfig.class dubbo.module ----> ModuleConfig.class dubbo.registry ----> RegistryConfig.class dubbo.protocol ----> ProtocolConfig.class dubbo.monitor ----> MonitorConfig.class dubbo.provider ----> ProvoderConfig.class dubbo.consumer ----> ConsumerConfig.class dubbo.config-center ----> ConfigCenterBean.class dubbo.metadata-report ----> MetadataReportConfig.class dubbo.metrics ----> MetricsConfig.class@EnableDubboConfigBinding multiple 为true或false的区别,名字的区别,根据multiple用来判断是否从配置项中获取beanName:如果multiple为false,则看有没有配置id属性,如果有,id属性就当做beanName,如果没有配置则自动生成一个beanName @DubboComponentScan : 扫描服务提供者(@Service)和引用者(@Reference) @Import(@DubboConfigConfigurationRegistrar implements ImportBeanDefinitionRegistrar) DubboComponentScanRegistrar.registerBeanDefinitions(AnnotationMetadata am,BeanDefinitionRegistry bdr) 1)拿到DubboComponentScan注解所定义的包路径,扫描该package下的类,识别这些类上的@Service和@Reference注解 2)注册ServiceAnnotationBeanPostProcessor一个bean,实现了BeanDefinitionRegistryPostProcessor接口,所以在Spring启动时会调用postProcessBeanDefinitionRegistry,该方法会进行扫描,扫描@Service注解了的类,然后生成BeanDefinition(会生成两个,一个普通的bean,一个ServiceBean),在serviceBean中会监听ContextRefreshedEvent事件,一旦spring启动完后,就会进行服务导出 serviceBean的名称:ServiceBean+":"+接口全路径名 serviceBean的ref属性执行普通bean实例对象的名字 service注解配置的参数,会被设置到ServiceBean实例对象的属性中 每个serviceBean都会接收到spring启动后刷新事件 3)注册ReferenceAnnotationBeanPostProcessor,实现了AnnotationBeanPostProcessor接口(),继而实现了InstantiationAwareBeanPostProcessorAdapter接口。所以spring在启动时,再对属性进行注入时会调用 AnnotationInjectedBeanPostProcessor 接口中的postProcessProperty,在这个过程中会按照@Reference注解的信息去生成一个ReferenceBean对象,设置给属性的不是ReferenceBean对象,而是ReferenceBean.get()得到的代理对象。 启动的时候,每个bean都会执行到AnnotationBeanPostProcessor接口中 查找的过程: 先查找使用了@Reference注解的字段,AnnotatedFieldElement 再查找使用了@Reference注解的方法 返回的是Dubbo定义的AnnotatedInjectionMetadata,接下来就会使用这个类去进行属性注入 @Reference标注字段的时候,如果同一个类中使用该注解标注了两个字段,得到的是两个不同的实例,因为没有缓存。 如何 得到引入服务的beanName attributes里存的是@Reference注解中所配置的属性和值 injectedType表示引入的是哪个服务接口 referenceBeanName的值为:ServiceBean+":"+接口全路径名 referenceBeanName表示我现在引用的这个服务,它导出是对应的ServiceBean的beanName是什么,可以用来判断现在我引用的这个服务接口 引入服务的入口:ReferenceConfig.get(){ init();//入口 }
转载地址:http://ddbnb.baihongyu.com/