Spring 根据条件启动@Bean

Spring Boot instinitate @Bean according to Condition

我在 spring 引导项目中工作,我想用拦截器实例化一个 Restemplate Bean,我的问题是我不想复制代码,因为只有 header 发生了变化对于每个配置。这是我的代码:

  @Bean
  @Qualifier("restTemplateOne")
  public RestTemplate restTemplateWithAccessToken() {
    return new RestTemplateBuilder()
      .interceptors((HttpRequest request, byte[] body, ClientHttpRequestExecution execution) -> {

        //this is the only header that i want to add for 
        request.getHeaders().set("MY_PARTICULAR_HEADER", "my value");

       request.getHeaders().set(HttpHeaders.AUTHORIZATION,"my auth value"); 

        return execution.execute(request, body);

      }).build();
  }

  @Bean
  @Qualifier("restTemplateTwo")
  public RestTemplate restTemplateWithIdToken() {
    return new RestTemplateBuilder()
      .interceptors((HttpRequest request, byte[] body, ClientHttpRequestExecution execution) -> {

        request.getHeaders().set(HttpHeaders.AUTHORIZATION,"my auth value");

        return execution.execute(request, body);

      }).build();
  }
  
  
  
  @Autowired
  @Qualifier("restTemplateOne")
  private RestTemplate restTemplateOne;
  
  @Autowired
  @Qualifier("restTemplateTwo")
  private RestTemplate restTemplateTwo;

你知道我如何优化代码以避免重复吗?比如给方法加一个参数,根据条件加不加header。

提前致谢。

只需提取并参数化您的拦截器:

    @Bean
    @Qualifier("restTemplateOne")
    public RestTemplate restTemplateWithAccessToken() {
        return new RestTemplateBuilder()
                .interceptors(new CustomClientHttpRequestInterceptor(true))
                .build();
    }

    @Bean
    @Qualifier("restTemplateTwo")
    public RestTemplate restTemplateWithIdToken() {
        return new RestTemplateBuilder()
                .interceptors(new CustomClientHttpRequestInterceptor(false))
                .build();
    }

    private static class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
        private boolean needParticularHeader;

        public CustomClientHttpRequestInterceptor(boolean needParticularHeader) {
            this.needParticularHeader = needParticularHeader;
        }

        @Override
        public ClientHttpResponse intercept(HttpRequest request,
                                            byte[] body,
                                            ClientHttpRequestExecution execution) throws IOException {
            if (needParticularHeader) {
                //this is the only header that i want to add for
                request.getHeaders().set("MY_PARTICULAR_HEADER", "my value");
            }

            request.getHeaders().set(HttpHeaders.AUTHORIZATION, "my auth value");

            return execution.execute(request, body);

        }
    }