当前位置: 首页 > news >正文

ps做网站字号大小网站建设.国风网络

ps做网站字号大小,网站建设.国风网络,网站开发代码无中文,wordpress精品主题系列文章目录 前言 本节我们的Dubbo源码版本基于2.6.x 在前一章我们的整合案例中#xff0c;我们有几个比较关键的步骤#xff1a; 在启动类上标注了EnableDubbo注解在provider类上面标注了Service注解来提供dubbo服务在消费的时候通过Reference注解引入dubbo服务在配置文件…系列文章目录 前言 本节我们的Dubbo源码版本基于2.6.x 在前一章我们的整合案例中我们有几个比较关键的步骤 在启动类上标注了EnableDubbo注解在provider类上面标注了Service注解来提供dubbo服务在消费的时候通过Reference注解引入dubbo服务在配置文件中配置应用名协议暴露端口注册中心地址等。在配置文件中配置应用名协议暴露端口注册中心地址等。 一、EnableDubbo注解 这里可以看到EnableDubbo是一个复合注解集成了EnableDubboConfig和DubboComponentScan注解 2. EnableDubbo注解的属性其中scanBasePackages和scanBasePackageClasses默认都是空这里是可以指定包扫描的路径或者基类的然后multipleConfig默认是true。 1.1、EnableDubboConfig注解 这里使用import注解导入了DubboConfigConfigurationRegistrar这里EnableDubboConfig注解中的multiple属性默认为true 1.1.1、DubboConfigConfigurationRegistrar 首先获取EnableDubboConfig注解中的属性列表这里会根据注解中的multiple属性判断是否是单一绑定配置还是多个实例绑定配置这里multiple默认为true。 这里单一实例和多实例的区别如下所示多实例就是协议我可能支持多种这样会根据我们是否支持多实例来给每个协议都生成一个配置. 1.1.2、AnnotatedBeanDefinitionRegistryUtils#registerBeans 上面会根据单实例还是多实例的区别来判断传入的注解类是DubboConfigConfiguration.Single还是 DubboConfigConfiguration.Multiple.class最终都会调用到registerBeans方法。这里会构造一个AnnotatedBeanDefinitionReader类然后会扫描上面传入的注解类然后注入到spring容器中。 1.1.3、DubboConfigConfiguration 我们上面把Single or Multiple 注解到spring容器中,然后发现对应类上面也标注了EnableDubboConfigBindings注解二者的区别就是Multiple多了一个注解属性multiple为trueEnableDubboConfigBindings注解中是一个EnableDubboConfigBinding注解的数组他的作用就是把配置文件中的配置信息和具体的类进行绑定。 1.1.4、EnableDubboConfigBindings注解 这里我们发现他也是通过import导入了一个DubboConfigBindingsRegistrar类。 1.1.5、DubboConfigBindingsRegistrar#registerBeanDefinitions 上面通过import导入了DubboConfigBindingsRegistrar他是实现ImportBeanDefinitionRegistrarspring就会在其生命周期中回调对应的registerBeanDefinitions方法。这里首先会获取EnableDubboConfigBindings注解中的属性列表然后获取value属性这里对应就是EnableDubboConfigBinding[]注解列表然后创建了一个DubboConfigBindingRegistrar注册器把spring的环境也就是ConfigurableEnvironment设置到注册器中从environment中可以获取到配置文件中的配置信息遍历EnableDubboConfigBinding[]注解列表注册对应的BeanDefinition 1.1.6、DubboConfigBindingRegistrar#registerBeanDefinitions 例EnableDubboConfigBinding(prefix “dubbo.applications”, type ApplicationConfig.class, multiple true), 这里首先会从EnableDubboConfigBinding中解析出来prefix属性的value得到dubbo.applications解析出来type属性得到ApplicationConfig.class解析出来multiple属性得到true把解析出来的参数全部传入调用registerDubboConfigBeans注册Dubbo的配置Bean 1.1.7、DubboConfigBindingRegistrar#registerDubboConfigBeans 这里调用getSubProperties方法从environment中也就是我们配置文件中的配置里面解析出来指定前缀的配置如果没有指定前缀的配置则不需要注册BeanDefinition根据multiple属性这里一般为true这样我们如果配置了多种协议那么就会生成多个beanName给每个beanName都注册一个空的BeanDefinition然后给每个Bean都注册一个DubboCOnfigBindingBeanPostProcessor的bean的后置处理器最后调用registerDubboConfigBeanCustomizers注册了一个NamePropertyDefaultValueDubboConfigBeanCustomizer的bean 1.1.7.1、PropertySourcesUtils#getSubProperties 把propertySources转成MutablePropertySources调用重载方法getSubProperties 这里就是遍历PropertySource解析出来指定前缀的配置然后缓存起来返回。 1.1.7.2、DubboConfigBindingRegistrar#resolveMultipleBeanNames 这里就是从配置中解析出来beanName。 比如配置是如下 dubbo.protocols.p1.namedubbo dubbo.protocols.p1.port20880 dubbo.protocols.p1.host0.0.0.0 这里properties传进来的就是 p1.namedubbo p1.port20880 … 那么解析出来的beanName就是p1 1.1.7.3、DubboConfigBindingRegistrar#registerDubboConfigBean 这里就是通过BeanDefinitionBuilder生成一个指定类型的空的beanDefinition并注册到spring容器中。 1.1.7.4、DubboConfigBindingRegistrar#registerDubboConfigBindingBeanPostProcessor 这里为我们刚刚每个注册的配置bean都同样注册一个DubboCOnfigBindingBeanPostProcessor类型的的bean后置处理器这里首先生成一个DubboConfigBindingBeanPostProcessor类型的BeanDefinitionBuilder然后这里会设置构造器参数值把前缀和beanName都传进去这里的前缀如dubbo.registries.r2beanName如r2这里设置构造器参数的value那么spring帮我们创建bean的时候就会调用对应的构造器把参数值传进去通过BeanDefinitionBuilder生成DubboConfigBindingBeanPostProcessor的BeanDefinition并注册到spring容器中。 1.1.7.5、DubboConfigBindingRegistrar#registerDubboConfigBeanCustomizers 这里会注册namePropertyDefaultValueDubboConfigBeanCustomizer的bean到spring容器中这里后续DubboConfigBindingBeanPostProcessor处理逻辑中会用到。 1.1.7.6、DubboConfigBindingBeanPostProcessor#postProcessBeforeInitialization 我们在上面会给每个配置bean都生成一个后置处理器那么在spring容器的生命周期中就会调用到后置处理器的postProcessBeforeInitialization方法我们来看下DubboConfigBindingBeanPostProcessor的postProcessBeforeInitialization方法这里会判断beanName是否一致只处理关联的那个bean这里会调用bind方法从properties中获取值并设置到DubboConfig对象中设置dubboConfig对象的name属性设置为beanName 1.1.7.7、DubboConfigBindingBeanPostProcessor#bind 这里会调用dubboConfigBinder的bind方法我们看下dubboConfigBinder是啥时候构造出来的他的bind方法是如何实现数据绑定的。 我们看到在DubboConfigBindingBeanPostProcessor#afterPropertiesSet方法会进行初始化操作这个方法也是spring提供的回调方法会在属性设置前调用到这个方法 这里initDubboConfigBinder方法首先会从spring容器中获取DubboConfigBinder类型的bean如果获取不到就创建默认的也就是DefaultDubboConfigBinder。 这里initConfigBeanCustomizers方法会从spring容器中获取DubboConfigBeanCustomizer类型的所有bean实现这里最少会有一个之前在DubboConfigBindingRegistrar中注册的namePropertyDefaultValueDubboConfigBeanCustomizer然后设置到configBeanCustomizers属性中并且会按照order进行排序. 1.1.7.8、DefaultDubboConfigBinder#bind 从上面我们知道如果我们没有注入DubboCOnfigBinder则默认是DefaultDubboConfigBinder这里会创建DataBinder这个是spring提供的用来实现数据绑定这里设置忽略无用的属性和不能解析的属性从properties中获取指定前缀的属性把perperties转成MutablePropertyValues调用dataBinder#bind方法执行绑定操作这里会把MutablePropertyValues中的配置绑定到dubboConfig中。 1.1.7.9、DubboConfigBindingBeanPostProcessor#customize 这里会遍历从spring容器中获取的所有configBeanCustomizers并调用其customize方法这里如果我们没有配置默认只有一个NamePropertyDefaultValueDubboConfigBeanCustomizer 这里其实就是判断如果DubboConfig中有name属性则判断如果name属性如果没有设置值则反射调用其set方法把beanName设置到name属性中。 1.2、DubboComponentScan注解 这里通过Import导入了DubboComponentScanRegistrar 1.2.1、DubboComponentScanRegistrar#registerBeanDefinitions 获取包扫描路径注册处理Service注解的后置处理器注册处理Reference注解的后置处理器 1.2.2、DubboComponentScanRegistrar#getPackagesToScan 获取DubboComponentScan注解中配置的属性获取value属性并把包路径数组转成set可以对重复的包路径去重如果指定了basePackageClasses那么说明需要对这些类所在包路径设置到set中如果都没指定包路径则使用当前标注了DubboComponentScan注解所在类的包路径作为基础包扫描路径。 1.2.3、DubboComponentScanRegistrar#registerServiceAnnotationBeanPostProcessor 注册ServiceAnnotationBeanPostProcessor后置处理器到spring容器中并制定构造器的参数值为包扫描路径这里spring会在生成bean的时候会调用构造方法设置进去 1.2.4、DubboComponentScanRegistrar#registerReferenceAnnotationBeanPostProcessor 注册registerReferenceAnnotationBeanPostProcessor后置处理器到spring容器中 1.2.5、ServiceAnnotationBeanPostProcessor#postProcessBeanDefinitionRegistry ServiceAnnotationBeanPostProcessor是一个BeanDefinitionRegistryPostProcessorspring会回调他的postProcessBeanDefinitionRegistry方法来让用户修改BeanDefinition这里会获取用户注解配置的包扫描调用registerServiceBeans注册ServiceBean 1.2.5.1、ServiceAnnotationBeanPostProcessor#postProcessBeanDefinitionRegistry 这里就是做了下占位符的处理因为有可能包路径中有占位符例xxx.${xx}…xxx。 1.2.5.2、ServiceAnnotationBeanPostProcessor#postProcessBeanDefinitionRegistry 这里首先创建DubboClassPathBeanDefinitionScanner用来执行包扫描从registry中解析出BeanNameGenerator设置的DubboClassPathBeanDefinitionScanner的beanNameGenerator为刚刚解析出来的BeanName生成器给scanner设置IncludeFilter表示只扫描标注了Dubbo中的Service注解的类遍历包路径执行扫描操作把扫描出来的BeanDifinition转换成BeanDefinitionHolder遍历BeanDefinitionHolders注册ServiceBean 1.2.5.3、ServiceAnnotationBeanPostProcessor#resolveBeanNameGenerator 判断如果BeanDefinitionRegistry是SingletonBeanRegistry类型则获取internalConfigurationBeanNameGenerator返回如果不是SingletonBeanRegistry或者从容器中没有获取到internalConfigurationBeanNameGenerator则使用AnnotationBeanNameGenerator 1.2.5.4、ServiceAnnotationBeanPostProcessor#findServiceBeanDefinitionHolders 获取出来packageToScan路径下标注了Service的BeanDefinition把扫描出来的BeanDefinition转换成BeanDefinitionHolder,Holder中包含BeanDefinition和BeanName 1.2.5.5、ServiceAnnotationBeanPostProcessor#registerServiceBean 从beanDefinitionHolde中解析出来对应的beanClass从BeanClass上获取标注的Service注解信息从beanClass和Service注解信息中解析出来对应实现的接口的class从从beanDefinitionHolder中获取BeanName构造ServiceBean的Definition这个ServiceBean用来存储这个服务提供者的元数据信息生成ServiceBean的BeanName如果没有冲突则会添加到spring容器中 1.2.5.5、ServiceAnnotationBeanPostProcessor#resolveClass 这里从BeanDefinition获取到对应的BeanClassName然后通过BeanClassName解析出来对应的class对象 1.2.5.6、ServiceAnnotationBeanPostProcessor#resolveServiceInterfaceClass 首先拿service注解中配置的interfaceClass属性如果没有指定在判断用户有没有在注解中指定interfaceName如果指定了则尝试解析出interfaceName对应的class返回如果注解中没有配置则获取到当前BeanClass实现的所有接口类然后获取第一个 1.2.5.6、ServiceAnnotationBeanPostProcessor#buildServiceBeanDefinition 首先通过BeanDefinitionBuilder生成一个空的ServiceBean的BeanDefinition这里获取BeanDefinition的propertyValues然后设置忽略的属性名因为这些都是对象类型是我们之前解析配置文件生成的配置类已经放到spring容器中需要通过注入的方式特殊赋值给BeanDefinition的propertyValues添加一个PropertyValues是AnnotationPropertyValuesAdapter这个可以从environment获取对应的配置后续spring在进行属性注入的时候会自动填充下面就是调用addPropertyReference这里会从spring容器中找到对应name的bean然后把对应的bean设置到其属性中 1.2.5.7、ServiceAnnotationBeanPostProcessor#generateServiceBeanName 这里serviceBeanName的生成规则就是拼接了接口名分组名版本号生成一个beanName 1.2.5.8、ServiceBean#onApplicationEvent 在上面我们已经把ServiceBean注册到Spring容器中那么他是什么时候进行服务暴露的注册到注册中上供外部服务调用,从下图我们可以看到他是继承了很多接口其中一个就是ApplicationListener并且监听的是容器刷新完成的时间。那么Spring容器在刷新完成的时候就会回调监听器的onApplicationEvent方法在这里会进行dubbo服务的导出操作这个后续我们再进行分析。 1.2.6、ReferenceAnnotationBeanPostProcessor 这里他继承了AnnotationInjectedBeanPostProcessor,并且指定了要进行自动注入的注解是Reference注解这个AnnotationInjectedBeanPostProcessor的回调时机是在Bean属性填充完毕后这里可以类比Autowried注解也是会有一个xxxProcessor来进行自动注入的逻辑 1.2.6.1 、AnnotationInjectedBeanPostProcessor#postProcessPropertyValues 这里首先会找到Bean所有标注了Reference注解的字段和方法然后对字段、方法进行反射绑定 1.2.6.2 、AnnotationInjectedBeanPostProcessor#findInjectionMetadata 这里首先从缓存中获取当前bean的注入元数据信息如果缓存中没有则会调用buildAnnotatedMetadata方法构造注解元数据 1.2.6.3 、AnnotationInjectedBeanPostProcessor#buildAnnotatedMetadata 这里首先查找这个类标注了Reference注解的属性元素再查找这个类标注了Reference注解的方法元素组装成AnnotatedInjectionMetadata返回 1.2.6.4 、AnnotationInjectedBeanPostProcessor#buildAnnotatedMetadata 这里就是遍历这个类对应的所有属性判断上面有没有标注Reference注解判断如果有标注注解如果修饰符是static那么也不支持如果满足条件则加入到元素列表中返回 1.2.6.5 、AnnotationInjectedBeanPostProcessor#findAnnotatedMethodMetadata 这里遍历类中的所有方法这里有可能方法是个泛型方法因为泛型在编译阶段会进行类型擦除Java编译器会将类型参数替换为其上界类型参数中extends子句的类型如果上界没有定义则默认为Object当一个子类在继承或实现一个父类或接口的泛型方法时在子类中明确指定了泛型类型那么在编译时编译器会自动生成桥接方法这样是为了避免子父类方法签名不一致就在子类自动生成一个与父类的方法签名一致的桥接方法所以这里会判断如果是桥接方法就找到被桥接的方法然后判断被桥接的方法是否可见方法上面有没有标注Reference注解如果有注解则判断是不是静态不支持静态方法也不支持无参方法因为这样没法进行注入了,不知道注入啥类型的把符合条件的方法收集返回 1.2.6.5 、InjectionMetadata#inject 在上面已经查询到了并组装成InjectionMetadata这里会调用inject方法执行注入操作这里是spring的源码会遍历每个element并调用其inject方法 1.2.6.6 、InjectionMetadata#inject 在上面调用每个element的inject方法就会调用到element具体的实现是方法的还是属性的 1.2.6.6.1 、AnnotatedFieldElement#inject 获取属性类型获取注入的对象通过反射设置到属性中 1.2.6.6.2、AnnotatedFieldElement#inject 获取属性类型获取注入的对象通过反射设置 1.2.6.7 、AnnotationInjectedBeanPostProcessor#getInjectedObject 首先构造缓存key从缓存中获取如果缓存中不存在则调用doGetInjectedBean获取注入的对象 1.2.6.8 、ReferenceAnnotationBeanPostProcessor#doGetInjectedBean 首先构造serviceBean的名字通过接口分组版本构造调用buildReferenceBeanIfAbsent方法生成ReferenceBean对象放入缓存中生成代理对象 1.2.6.9 、ReferenceAnnotationBeanPostProcessor#buildReferenceBeanIfAbsent 先从缓存中获取referenceBean如果缓存中没有则通过ReferenceBeanBuilder生成一个referenceBean 1.2.6.9.1 、ReferenceBeanBuilder#build 这里checkDependencies是个空方法调用doBuild创建一个ReferenceBean调用configureBean配置ReferenceBean的相关属性 1.2.6.9.2 、ReferenceBeanBuilder#doBuild 这里直接创建一个ReferenceBean返回 1.2.6.9.3、AbstractAnnotationConfigBeanBuilder#doBuild ConfigureBean的前置操作然后设置注册中心配置监控中心配置应用配置模块配置等ConfigureBean的后置操作 1.2.6.9.4、ReferenceBeanBuilder#preConfigureBean 这里又使用到了DataBinder来给referenceBean来做数据绑定这里给filter和listener属性注册了StringTrimmerEditor他会帮助格式化String去除前后空格处理parameters属性通过自定义的PropertyEditorSupport把String处理成map调用dataBinder#bind方法这里会自动给referenceBean绑定配置文件中的相关配置 1.2.6.9.5、AbstractAnnotationConfigBeanBuilder#configureRegistryConfigs 这里设置配置的逻辑一致都是从Reference注解中获取对应的配置名然后从spring容器中找到对应的配置Bean然后设置到属性中。 1.2.6.9.6、ReferenceBeanBuilder#postConfigureBean 这里还是设置一些属性到ReferenceBean中其中具体就不细看了和上面类似 1.2.6.10 、ReferenceAnnotationBeanPostProcessor#cacheInjectedReferenceBean 这里就是把对应的注入点和对应的注入值放入缓存中 1.2.6.11 、ReferenceAnnotationBeanPostProcessor#buildProxy 调用buildInvocationHandler方法构造一个InvocationHandler创建一个proxy对象返回这里需要代理对象是因为Dubbo在调用的时候就算是本地服务也有负载均衡注册中心等一系列其他的逻辑因此不能直接返回服务实现类而是返回代理对象公共的操作让代理对象去执行 1.2.6.12 、ReferenceAnnotationBeanPostProcessor#buildInvocationHandler .1 先从缓存中获取如果缓存中没有就创建一个 2. 判断当前spring容器中有没有包含着这个引用的bean如果有说明是本地调用则缓存起来 3. 如果是远程调用则会调用ReferenceBeanInvocationHandler#init方法 1.2.6.12 、ReferenceBeanInvocationHandler#init 这里会调用referenceBean#get方法会返回一个代理对象这里#referenceBean#get方法是服务引入的核心逻辑我们后续章节剖析 最后这里返回的代理对象会被设置到对应标注了Reference的属性中然后调用其方法都会走到代理对象这里Dubbo会在这里面做一系列远程调用服务容错服务逻辑的逻辑。
http://www.w-s-a.com/news/72615/

相关文章:

  • 手机端 网站 模板网页广告关不掉怎么办
  • 软装公司网站建设有没有做任务的网站
  • 加盟招商网站建设工业设计网站 知乎
  • 怎么做淘宝客网站优化免费windows7云主机
  • 有什么网站可以推广信息沈阳网站建设思路
  • 网站建设可研域名解析在线工具
  • 鲜花销售网站模板wordpress+模版+推荐
  • 企业网站报价网站域名 没有续费
  • 机关门户网站建设管理情况邮箱登陆嵌入网站
  • 创建网站超市网站建设后还有什么费用
  • 徐州泉山区建设局网站企业网站注册官网
  • 西青网站建设暴雪回归
  • 如何生成网站建设局建筑电工证查询网站
  • 网站改版建设原则网站网站建设公司上海
  • 网站推广见效快的方法深圳高端网站建设网页设计
  • 建设银行官网首页网站购纪念币接做网站需要问什么条件
  • 网站的ftp地址是什么江苏做网站
  • 宁波网站建设制作公司哪家好潍坊建公司网站
  • 云端网站建设php7 wordpress速度
  • 建站的公司中小企业网站建设报告
  • 上海高档网站建设网站设计入门
  • 德尔普网站建设做网站线
  • 宁波网站搭建定制非模板网站建设电子商务公司名称大全简单大气
  • 巴中哪里做网站推销网站的方法
  • wordpress建站动画网站宣传的手段有哪些?(写出五种以上)
  • 做么网站有黄医疗机构网站备案
  • 企业年金是1比3还是1比4北京厦门网站优化
  • 政务信息网站建设工作方案云南建设工程质量监督网站
  • 如何做一份企业网站免费的短视频素材库
  • 云脑网络科技网站建设咸阳软件开发