配置类RibbonAutoConfiguration的实例属性configurations是如何注入的?

Posted starkbrothers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置类RibbonAutoConfiguration的实例属性configurations是如何注入的?相关的知识,希望对你有一定的参考价值。

1、【RibbonAutoConfiguration】类之所以成为配置类,是因为被【@Configuration】注解,而【@Configuration】本身又是被【@Component】注解的,所以该配置类最终会被实例化为一个配置向Bean。

2、其存在一个属性【configurations】,是一个List集合,类型为【RibbonClientSpecification】。在该配置类实例化时会被注入【BeanFactory】中所有【RibbonClientSpecification】类型的【BeanDefinition】,其实这些【BeanDefinition】都是一些配置了,用于定义各【RibbonClient】特有的配置,此外还有一些默认的【RibbonClient】配置。

3、调试过程中,通过负载均衡客户端【loadBalancerClient】调用Eureka客户端应用【user】时,发现属性【configurations】已经存在图中的三个配置项,第一个是为应用【user】特别指定的配置,后两个是默认的配置,并且第二个对应的配置类为空。

技术图片

4、这三个RibbonClient配置的类型均为【RibbonClientSpecification】,后两个的【name】属性以【default】开头,所以是Client的默认配置,第一个的【name】属性为user,对应为自定义的特殊配种。但它们的【configuration】属性分别为三个配置类【com.mq.cloud.movie.ribbon.RibbonConfiguration】、空、【org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration】。

5、那这三个配置类是如何与一个名字结合形成【RibbonClientSpecification】实例,并进入【BeanFactory】的Bean定义集合中的呢?

这是因为它们曾作为【@RibbonClients】的【defaultConfiguration】属性或【@RibbonClient】的【configuration】属性出现在某个配置类上。

这两个类都被【@@Import(RibbonClientConfigurationRegistrar.class)】注解过。

技术图片

技术图片

而Bean定义注册类【RibbonClientConfigurationRegistrar】会将【@RibbonClients】中指定的默认全局配置【defaultConfiguration】和【@RibbonClient】中与Client名字一起指定的配置【configuration】组建成【RibbonClientSpecification】实例,并注入到【BeanFactory】的Bean定义集合中。

技术图片

以上是关于配置类RibbonAutoConfiguration的实例属性configurations是如何注入的?的主要内容,如果未能解决你的问题,请参考以下文章

Spring配置类替代xml配置文件

Spring Boot参考教程Spring Boot配置使用之配置类用法

【Spring】简述@Configuration配置类注册BeanDefinition到Spring容器的过程

SpringBoot配置类编写

拦截器配置类使用继承写法导致jackson的全局配置失效

flask实战-个人博客-使用类组织配置