Ribbon 源码详解(一):默认初始化加载的bean

@LoadBalanced注解的源码:

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@Qualifier

public @interface LoadBalanced {

}

注意有@Qualifier这个注解,这个注解用在另外一个注解上(这里是LoadBalanced)时,代表所有含有@LoadBalanced注解的bean都会被标记起来,如果这时有:

@LoadBalanced

@Autowired(required = false)

private List<RestTemplate> restTemplates = Collections.emptyList();

代表所有被LoadBalanced修饰的restTemplates会被装载到这里

在我们的应用启动时,LoadBalancerAutoConfiguration会给所有被@LoadBalanced注解修饰的RestTemplate增加一个LoadBalanceInterceptor:

@Configuration

@ConditionalOnClass(RestTemplate.class)

@ConditionalOnBean(LoadBalancerClient.class)

@EnableConfigurationProperties(LoadBalancerRetryProperties.class)

public class LoadBalancerAutoConfiguration {

    @LoadBalanced

    @Autowired(required = false)

    //所有被LoadBalanced修饰的restTemplates会被装载到这里

    private List<RestTemplate> restTemplates = Collections.emptyList();

 

    //SmartInitializingSingleton代表所有非lazy单例Bean实例化完成后的回调方法,即所有被LoadBalanced修饰的restTemplates会被初始化并装载到这里之后,这个afterSingletonsInstantiated会被回调

    @Bean

    public SmartInitializingSingleton loadBalancedRestTemplateInitializer(

            final List<RestTemplateCustomizer> customizers) {

        return new SmartInitializingSingleton() {

            @Override

            public void afterSingletonsInstantiated() {

                //所有restTemplate被customizers处理

                for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {

                    for (RestTemplateCustomizer customizer : customizers) {

                        customizer.customize(restTemplate);

                    }

                }

            }

        };

    }

    @Autowired(required = false)

    private List<LoadBalancerRequestTransformer> transformers = Collections.emptyList();

    @Bean

    @ConditionalOnMissingBean

    public LoadBalancerRequestFactory loadBalancerRequestFactory(

            LoadBalancerClient loadBalancerClient) {

        return new LoadBalancerRequestFactory(loadBalancerClient, transformers);

    }

    //在没有包含spring-retry这个依赖时,以下会被初始化,我们上面的项目就是没有加入spring-retry这个依赖

    @Configuration

    @ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")

    static class LoadBalancerInterceptorConfig {

        //初始化LoadBalancerInterceptor

        @Bean

        public LoadBalancerInterceptor ribbonInterceptor(

                LoadBalancerClient loadBalancerClient,

                LoadBalancerRequestFactory requestFactory) {

            return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);

        }

        //这个RestTemplateCustomizer就是为restTemplate添加一个LoadBalancerInterceptor

        @Bean

        @ConditionalOnMissingBean

        public RestTemplateCustomizer restTemplateCustomizer(

                final LoadBalancerInterceptor loadBalancerInterceptor) {

            return new RestTempla

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值