关于Spring-cloud ribbon 中@Bean 和 内部匿名类 理解

90 阅读1分钟

先给代码:

@Configuration @ConditionalOnClass(RestTemplate.class) @ConditionalOnBean(LoadBalancerClient.class) public class LoadBalancerAutoConfiguration {
@LoadBalanced
@Autowired(required = false)
private List restTemplates = Collections.emptyList(); @Bean
public SmartInitializingSingleton loadBalancedRestTemplateInitializer( final List customizers) { return new SmartInitializingSingleton() { @Override public void afterSingletonsInstantiated() { for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) { for (RestTemplateCustomizer customizer : customizers) { customizer.customize(restTemplate); } } } }; } @Bean @ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer( final LoadBalancerInterceptor loadBalancerInterceptor) { return new RestTemplateCustomizer() { @Override public void customize(RestTemplate restTemplate) { List list = new ArrayList<>( restTemplate.getInterceptors()); list.add(loadBalancerInterceptor); restTemplate.setInterceptors(list); } }; } @Bean public LoadBalancerInterceptor ribbonInterceptor( LoadBalancerClient loadBalancerClient) { return new LoadBalancerInterceptor(loadBalancerClient); } }

很多文章都说在这里为RestTemplate 配了LoadBalancerInterceptor。 其实这里只是生成bean,并没有执行里面的内部匿名类重写后的方法。

image.png

image.png 这个方法会在bean初始化完的时候,spring工程会调用一下

image.png

补充:当接口 new 时,重写了内部匿名类的方法。会变成一个类,是实现了接口的方法的,在对象传递过程中,调用了方法,其实是内部匿名类调用了实现的方法。

举例:

LoadBalancerRequest<ListenableFuture<ClientHttpResponse>>()  result = new LoadBalancerRequest<ListenableFuture<ClientHttpResponse>>() {
   @Override
   public ListenableFuture<ClientHttpResponse> apply(
         final ServiceInstance instance) throws Exception {
      HttpRequest serviceRequest = new ServiceRequestWrapper(request,
            instance, AsyncLoadBalancerInterceptor.this.loadBalancer);
      return execution.executeAsync(serviceRequest, body);
   }

});

其实是

LoadBalancerRequestFactory$1 impliment LoadBalancerRequest{
  T apply(  final ServiceInstance instance) throws Exception {
      HttpRequest serviceRequest = new ServiceRequestWrapper(request,
            instance, AsyncLoadBalancerInterceptor.this.loadBalancer);
      return execution.executeAsync(serviceRequest, body);
  }
}

对象传递,直到代码调用时 result.apply() 其实是LoadBalancerRequestFactory$1.apply()