我刚刚创建了一个FactoryBean
实现以请求RestTemplate
:
@Component
public class RestTemplateFactory
implements FactoryBean<RestTemplate>, InitializingBean {
//init resttemplate headers
}
因此,现在我可以在任何一个班级注入RestTemplate
:
@Service
public class DocumentServiceBackOffice {
private RestTemplate restTemplate;
public DocumentServiceBackOffice(RestTemplate restTemplate) {//...}
}
但是,我想创建另一个FactoryBean<RestTemplate>
来初始化其他参数。
我如何创建才能根据qualifier
注入一个或另一个?
有什么想法吗?
编辑
@Component
public class RestTemplateFactory
implements FactoryBean<RestTemplate>, InitializingBean {
private RestTemplate restTemplate;
private JWTService jwtService;
public RestTemplateFactory(JWTService jwtService) {
this.jwtService = jwtService;
}
public RestTemplate getObject() {
return this.restTemplate;
}
public Class<RestTemplate> getObjectType() {
return RestTemplate.class;
}
public boolean isSingleton() {
return true;
}
public void afterPropertiesSet() {
this.restTemplate = new RestTemplate();
JWTHeaderRequestInterceptor jwtInterceptor = new JWTHeaderRequestInterceptor(this.jwtService);
this.restTemplate.setInterceptors(Arrays.asList(jwtInterceptor));
}
}
答案 0 :(得分:1)
不是使用FactoryBean
,而是使用带有RestTemplateBuilder
的@Bean
注释方法,并使用该方法来配置实例。
@Bean
@Primary
public RestTemplate fooRestTemplate(RestTemplateBuilder builder, JWTService jwtService) {
return builder.additionalInterceptors(Collections.singletonList(new JwtHeaderInterceptor(jwtService)).build();
}
@Bean
public RestTemplate barRestTemplate(RestTemplateBuilder builder {
return builder.build();
}
这将导致2个可用的RestTemplate
实例。 fooRestTemplate
(由于@Primary
被标记为默认值)和barRestTemplate
。要指定要使用的特定地址,请添加@Qualifier("barRestTemplate")
以使用非默认值。
public DocumentServiceBackOffice(@Qualifier("barRestTemplate") RestTemplate restTemplate) { ... }
答案 1 :(得分:1)
另一种方法是使用两个带有限定符的RestTemplate
bean定义配置。
@Configuration
public class Configuration {
@Bean
@Qualifier("firstRestTemplate")
public RestTemplate firstRestTemplate(){
// any building logic here
return new Resttemplate();
}
@Bean
@Qualifier("secondRestTemplate")
public RestTemplate secondRestTemplate(){
// any building logic here
return new Resttemplate();
}
}
然后,在您的代码中,自动布线时请使用正确的@Qualifier
。
Setter注入示例:
@Service
public class Service {
@Autowired
@Qualifier("firstRestTemplate")
private RestTemplate template;
// ...
}
构造函数注入示例:
@Service
public class Service {
private RestTemplate template;
public Service(@Autowired @Qualifier("firstRestTemplate") RestTemplate template) {
this.template = template;
}
// ...
}