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

莆田网站建设网正规网站建设多少钱

莆田网站建设网,正规网站建设多少钱,html教程视频自学免费,360排名检测Ribbon服务实现不同服务#xff0c;不同配置是通过RibbonClient和RibbonClients两个注解来实现的。RibbonClient注册的某个Client配置类。RibbonClients注册的全局默认配置类。 Feign实现不同服务#xff0c;不同配置#xff0c;是根据FeignClient来获取自定义的配置。 示…Ribbon服务实现不同服务不同配置是通过RibbonClient和RibbonClients两个注解来实现的。RibbonClient注册的某个Client配置类。RibbonClients注册的全局默认配置类。 Feign实现不同服务不同配置是根据FeignClient来获取自定义的配置。 示例 定义Ribbon配置类 public class AppRibbonConfig {Beanpublic IPing iping() {return new DummyPing();} }启动类上添加注解 RibbonClient(name app-provider, configuration AppRibbonConfig.class) 源码解析 RibbonClient和RibbonClients 这两个注解的功能都是引入RibbonClientConfigurationRegistrar该类主要是生成RibbonClientSpecification的BeanDefinition。 RibbonAutoConfiguration 该类会获取到所有的RibbonClientSpecification设置到SpringClientFactory的map集合中。 public class RibbonAutoConfiguration {Autowired(required false)private ListRibbonClientSpecification configurations new ArrayList();Autowiredprivate RibbonEagerLoadProperties ribbonEagerLoadProperties;public RibbonAutoConfiguration() {}Beanpublic HasFeatures ribbonFeature() {return HasFeatures.namedFeature(Ribbon, Ribbon.class);}Beanpublic SpringClientFactory springClientFactory() {SpringClientFactory factory new SpringClientFactory();factory.setConfigurations(this.configurations);return factory;} }系统中默认的配置有RibbonAutoConfiguration和RibbonEurekaAutoConfigurationRibbonEurekaAutoConfiguration类上的注解上含有配置类EurekaRibbonClientConfiguration。 Configuration EnableConfigurationProperties ConditionalOnRibbonAndEurekaEnabled AutoConfigureAfter({RibbonAutoConfiguration.class}) RibbonClients(defaultConfiguration {EurekaRibbonClientConfiguration.class} ) public class RibbonEurekaAutoConfiguration {public RibbonEurekaAutoConfiguration() {} }EnableFeignClients 该类会注册FeignClientSpecification。FeignClientsRegistrar#registerBeanDefinitions会加载默认配置和对应的FeignClient服务名的配置。 public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {this.registerDefaultConfiguration(metadata, registry);this.registerFeignClients(metadata, registry);}private void registerDefaultConfiguration(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {MapString, Object defaultAttrs metadata.getAnnotationAttributes(EnableFeignClients.class.getName(), true);if (defaultAttrs ! null defaultAttrs.containsKey(defaultConfiguration)) {String name;if (metadata.hasEnclosingClass()) {name default. metadata.getEnclosingClassName();} else {name default. metadata.getClassName();}this.registerClientConfiguration(registry, name, defaultAttrs.get(defaultConfiguration));}}private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) {BeanDefinitionBuilder builder BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class);builder.addConstructorArgValue(name);builder.addConstructorArgValue(configuration);registry.registerBeanDefinition(name . FeignClientSpecification.class.getSimpleName(), builder.getBeanDefinition());}FeignAutoConfiguration FeignAutoConfiguration会获取到FeignClientSpecification Configuration ConditionalOnClass({Feign.class}) EnableConfigurationProperties({FeignClientProperties.class, FeignHttpClientProperties.class}) public class FeignAutoConfiguration {Autowired(required false)private ListFeignClientSpecification configurations new ArrayList();public FeignAutoConfiguration() {}Beanpublic HasFeatures feignFeature() {return HasFeatures.namedFeature(Feign, Feign.class);}Beanpublic FeignContext feignContext() {FeignContext context new FeignContext();context.setConfigurations(this.configurations);return context;}FeignClientFactoryBean 系统启动的时候会加载FeignClientFactoryBean会执行FeignClientFactoryBean#getObject获取到context对象从而获取相应的组件。 protected Builder feign(FeignContext context) {FeignLoggerFactory loggerFactory (FeignLoggerFactory)this.get(context, FeignLoggerFactory.class);Logger logger loggerFactory.create(this.type);Builder builder ((Builder)this.get(context, Builder.class)).logger(logger).encoder((Encoder)this.get(context, Encoder.class)).decoder((Decoder)this.get(context, Decoder.class)).contract((Contract)this.get(context, Contract.class));this.configureFeign(context, builder);return builder;}protected T T get(FeignContext context, ClassT type) {T instance context.getInstance(this.contextId, type);if (instance null) {throw new IllegalStateException(No bean found of type type for this.contextId);} else {return instance;}}第一次访问服务 Ribbon是懒加载的NamedContextFactory#getContext第一次访问是没有context对象的所以会进行创建。 protected AnnotationConfigApplicationContext getContext(String name) {if (!this.contexts.containsKey(name)) {synchronized(this.contexts) {if (!this.contexts.containsKey(name)) {this.contexts.put(name, this.createContext(name));}}}return (AnnotationConfigApplicationContext)this.contexts.get(name);}NamedContextFactory#createContext根据服务配置生成对应的AnnotationConfigApplicationContext protected AnnotationConfigApplicationContext createContext(String name) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext();if (this.configurations.containsKey(name)) {Class[] var3 ((NamedContextFactory.Specification)this.configurations.get(name)).getConfiguration();int var4 var3.length;for(int var5 0; var5 var4; var5) {Class? configuration var3[var5];context.register(new Class[]{configuration});}}Iterator var9 this.configurations.entrySet().iterator();while(true) {Entry entry;do {if (!var9.hasNext()) {context.register(new Class[]{PropertyPlaceholderAutoConfiguration.class, this.defaultConfigType});context.getEnvironment().getPropertySources().addFirst(new MapPropertySource(this.propertySourceName, Collections.singletonMap(this.propertyName, name)));if (this.parent ! null) {context.setParent(this.parent);context.setClassLoader(this.parent.getClassLoader());}context.setDisplayName(this.generateDisplayName(name));context.refresh();return context;}entry (Entry)var9.next();} while(!((String)entry.getKey()).startsWith(default.));Class[] var11 ((NamedContextFactory.Specification)entry.getValue()).getConfiguration();int var12 var11.length;for(int var7 0; var7 var12; var7) {Class? configuration var11[var7];context.register(new Class[]{configuration});}}}Ribbon提前加载 ribbon:eager-load:clients: app-providerenabled: true在RibbonAutoConfiguration中会根据配置判断是否生成对象ribbonApplicationContextInitializer Bean ConditionalOnProperty({ribbon.eager-load.enabled}) public RibbonApplicationContextInitializer ribbonApplicationContextInitializer() {return new RibbonApplicationContextInitializer(this.springClientFactory(), this.ribbonEagerLoadProperties.getClients()); }RibbonApplicationContextInitializer#initialize该类主要是根据配置的clients数据对相应的服务进行加载 protected void initialize() {if (this.clientNames ! null) {Iterator var1 this.clientNames.iterator();while(var1.hasNext()) {String clientName (String)var1.next();this.springClientFactory.getContext(clientName);}} }
http://www.hkea.cn/news/14324519/

相关文章:

  • 婚庆公司网站源码大型网站构建实施方案
  • 网站品牌推广设计wordpress相关书籍
  • 做农村网站多少钱手机兼职软件
  • 网站建设赠送seo天津网站建设设计开发公司
  • wordpress建站教程书籍零基础学广告设计
  • 关于手表网站建设策划书做外贸需要几个网站
  • 房产网站 设计方案今朝装饰口碑怎么样
  • flash网站首页上海网站推广服务
  • 青岛seo网站管理做网站公司怎么拉客户
  • 在婚恋网站上做红娘怎么样网站前端设计是什么意思
  • 涿州网站建设有限公司杭州网站建设公司
  • vi设计一套多少钱通辽做网站0475seo
  • 做网站有哪些类型的制作宣传册用什么app
  • 宝应建设局网站商城建站模板
  • 建个好网站中级经济师考试科目
  • 网站布局模版广州市服务好的网站制作排名
  • 网站建设必须安装程序大学生个人简历电子版模板
  • 网站建设公司 未来seo怎么做优化工作
  • 万全县城乡建设网站湖北省建设主管网站
  • 平面设计培训网站保险网站导航
  • 蘑菇街网站怎么做想做电商从哪里入手
  • 专业网站制作网络公司网站群建设分析
  • 网站建设遇到哪些危险虚拟搭建wordpress
  • 面试网站建设需要的简历外贸网站建设 公司
  • 网站内部推广做网站链接容易吗
  • flash网站好做seo不做网站head.htm
  • 深远互动 网站建设电脑怎么制作图片
  • 毕业设计网站开发实施步骤网站开发入门教程
  • 中文网站模板 免费2018十大网络营销案例
  • 广东工程建设监理协会网站网站维护员招聘