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

超市网站源码深圳有几个区 分别叫什么

超市网站源码,深圳有几个区 分别叫什么,聊城网站设计公司,多语言网站(如何实现网站的多语言版本 )Ribbon服务实现不同服务,不同配置是通过RibbonClient和RibbonClients两个注解来实现的。RibbonClient注册的某个Client配置类。RibbonClients注册的全局默认配置类。 Feign实现不同服务,不同配置,是根据FeignClient来获取自定义的配置。 示…

Ribbon服务实现不同服务,不同配置是通过@RibbonClientRibbonClients两个注解来实现的。@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 List<RibbonClientSpecification> 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;}
}

系统中默认的配置有RibbonAutoConfigurationRibbonEurekaAutoConfigurationRibbonEurekaAutoConfiguration类上的注解上含有配置类,EurekaRibbonClientConfiguration

@Configuration
@EnableConfigurationProperties
@ConditionalOnRibbonAndEurekaEnabled
@AutoConfigureAfter({RibbonAutoConfiguration.class})
@RibbonClients(defaultConfiguration = {EurekaRibbonClientConfiguration.class}
)
public class RibbonEurekaAutoConfiguration {public RibbonEurekaAutoConfiguration() {}
}

@EnableFeignClients

该类会注册FeignClientSpecificationFeignClientsRegistrar#registerBeanDefinitions,会加载默认配置和对应的FeignClient服务名的配置。

    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {this.registerDefaultConfiguration(metadata, registry);this.registerFeignClients(metadata, registry);}private void registerDefaultConfiguration(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {Map<String, 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 List<FeignClientSpecification> 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, Class<T> 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.yayakq.cn/news/577286/

相关文章:

  • 俄罗斯免费网站推广网站菜单模板
  • 网站建设费可以抵扣吗wordpress代码上传
  • 临桂县住房和城乡建设局网站网站标题怎么修改
  • 做装修网站价格软件工程学科评估排名
  • 网站建设沟通准备培训学校网站建设方案
  • 做网页的素材网站杭州专业做网站
  • 之路网站建设it在线学习网站开发
  • 自己怎么做返利网站上海网站建设百度推广公司
  • 盘锦网站建设多少钱电商创业需要多少资金
  • 企业网站建设一般包含哪些内容做网站的工作是什么
  • 任丘做网站价格攀枝花网站怎么做seo
  • 做买鞋网站的论文内丘附近网站建设价格
  • 做网站推广 优帮云网站备案 途径
  • 设计师关注的十大网站运营好的网站制作中心
  • 模板网站免费建站京东网站开发多少钱
  • 游戏网站平台怎么做的一线视频免费观看
  • 设计网站怎么设计陕西省城乡建设厅的网站
  • 做企业网站项目的心得网站建设86215
  • 高校网站建设情况报告范文钢结构工程外包项目网
  • 企业信息化建设如何帮助客户理解网站流量易居房产网下载
  • 有哪些免费网站可以做店招赣州网站制作公司
  • 网站服务器申请wordpress英文版登陆
  • 南安淘宝网站建设学校网站建设源码
  • 电商网站开发设计net网站开发环境
  • 水果商城网站制作多少钱北京虚拟注册地址新政
  • 资溪做面包招聘的网站wordpress打开网站加速
  • 网站文章展示是做怎么广东新闻联播2011
  • ip代理池白帽seo是什么
  • 做网站提成物联网应用技术就业前景
  • asp网站首页模板语言互动网站建设