我有一个包装器,自动装配功能区识别RestTemplate,然后我添加一个拦截器 -
@Component
public class MyRestTemplate {
@Autowired
private RestTemplate restTemplate;
@PostConstruct
public void init(){
restTemplate.setInterceptors(Collections.singletonList(new
MyRestTemplateRequestInterceptor(applicationName)));
}
}
如果我在其他组件中使用@AutoWire RestTemplate,我是否会使用此incterceptor获取相同的RestTemplate实例?我的观察结果是其他组件中的autowired resttemplate也添加了这个拦截器。请帮助验证理解。
答案 0 :(得分:0)
你会得到相同的RestTemplate实例。当bean MyRestTemplate是构造函数(而不是它的构造之后)时,你将MyRestTemplateRequestInterceptor添加到RestTemplate
拦截器。
所以这个拦截器将应用于RestTemplate
。
如果您希望为特定的假装客户端应用拦截器,您可以创建自己的配置:
@Configuration
@IgnoreDuringScan
public class FeignClientConfiguration {
@Autowired
private Environment environment;
@Bean
public Encoder feignEncoder() {
return new GsonEncoder();
}
@Bean
public ErrorDecoder feignDecoder() {
return new GsonDecoder();
}
@Bean
public RequestInterceptor requestHeaderInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
//impl
}
};
}
@Bean
public Feign.Builder feingBuilder() {
return Feign.builder().encoder(feignEncoder()).decoder(feignDecoder()).errorDecoder(new YourErrorDecoder())
.requestInterceptor(requestHeaderInterceptor);
}
}
然后将配置应用于假装客户端:
@FeignClient(name = "myFeign", url = "url/...", configuration = {
FeignClientConfiguration.class
})
public interface YourFeignClient {
//....
}