@Primary注解作用以及springcloud中使用RestTemplate踩坑
问题描述
在使用RestTemplate调用项目API时,产生了No instances available for localhost错误,导致无法调用。
原因分析
程序开始在启动类(xxxApplication.class)中向IOC容器添加了restTemplate Bean,并使用@LoadBalanced注解实现负载均衡
@Bean
@LoadBalanced
public RestTemplate loadBalancer(RestTemplateBuilder builder){
return builder.build();
}
使用时,就是使用这个bean(使用@Autowired进行注入)去调用第三方接口, 重点在这里,restTemplate加上负载均衡注解后,就会去注册中心寻找服务。因为是第三方的服务(用的是ip,而不是实例名;)所以报找不到实例的异常。
解决方案
方法一
向Bean容器中重新注入一个没有加负载均衡注解的RestTemplate,修改名称(防止和启动类中注入的Bean冲突),然后获取这个restTemplate去调用第三方接口
@Bean
public RestTemplate restTemplateRemote(RestTemplateBuilder builder){
return builder.build();
}
@Autowired
@Qualifier(value = "RestTemplateRemote")
private RestTemplate rest;
方法二
使用@Primary注解
@Primary注解详解
@Bean
public AMapper aMapper1(AConfig aConfig) {
return new AMapperImpl1(aConfig);
}
@Bean
@Primary
public AMapper aMapper2(AConfig aConfig) {
return new AMapperImpl2(aConfig);
}
上述代码,当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现标识。当给指定的组件添加@primary后,默认会注入@Primary的配置组件。