Spring 弹簧靴:两个FactoryBean<;RestTemplate>;实现
我刚刚创建了一个Spring 弹簧靴:两个FactoryBean<;RestTemplate>;实现,spring,spring-boot,Spring,Spring Boot,我刚刚创建了一个FactoryBean实现,以请求RestTemplate: @Component public class RestTemplateFactory implements FactoryBean<RestTemplate>, InitializingBean { //init resttemplate headers } 但是,我想创建另一个FactoryBean,以初始化其他参数 如何根据限定符创建一个或另一个 有什么想法吗 编辑 @Compon
FactoryBean
实现,以请求RestTemplate
:
@Component
public class RestTemplateFactory
implements FactoryBean<RestTemplate>, InitializingBean {
//init resttemplate headers
}
但是,我想创建另一个FactoryBean
,以初始化其他参数
如何根据限定符创建一个或另一个
有什么想法吗
编辑
@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));
}
}
@组件
公共类RestTemplateFactory
实现FactoryBean,初始化Bean{
私有RestTemplate RestTemplate;
私人JWTService JWTService;
公共RestTemplateFactory(JWTService JWTService){
this.jwtService=jwtService;
}
公共RestTemplate getObject(){
返回此.rest模板;
}
公共类getObjectType(){
返回restemplate.class;
}
公共布尔isSingleton(){
返回true;
}
公共无效afterPropertiesSet(){
this.restTemplate=新的restTemplate();
JWTHeaderRequestInterceptor jwtInterceptor=新的JWTHeaderRequestInterceptor(this.jwtService);
setInterceptors(Arrays.asList(jwtInterceptor));
}
}
不要使用FactoryBean
只需使用@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();
}
这将产生两个可用的RestTemplate
实例。fooRestTemplate
(由于@Primary
而标记为默认)和barRestTemplate
。要指定要使用的特定限定符,请添加一个@限定符(“barRestTemplate”)
以使用非默认限定符
public DocumentServiceBackOffice(@Qualifier("barRestTemplate") RestTemplate restTemplate) { ... }
不要使用FactoryBean
,只需使用一个@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();
}
这将产生两个可用的RestTemplate
实例。fooRestTemplate
(由于@Primary
而标记为默认)和barRestTemplate
。要指定要使用的特定限定符,请添加一个@限定符(“barRestTemplate”)
以使用非默认限定符
public DocumentServiceBackOffice(@Qualifier("barRestTemplate") RestTemplate restTemplate) { ... }
另一种方法是使用两个带限定符的restemplate
bean定义配置
然后,在代码中,在自动布线时使用正确的限定符
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;
}
// ...
}
构造函数注入示例:
@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;
}
// ...
}
另一种方法是使用两个带限定符的restemplate
bean定义配置
然后,在代码中,在自动布线时使用正确的限定符
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;
}
// ...
}
构造函数注入示例:
@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;
}
// ...
}
使用限定符。。。另外,我建议不要使用FactoryBean
,而是将RestTemplateBuilder
注入@Bean
方法中。我应该在哪里使用@Qualifier
?在FactoryBean
implementations上?构造函数参数。我想你的意思是DocumentServiceBackOffice(@Qualifier RestTemplate RestTemplate)
。但是,我不太明白这个@Qualifier
是如何与FactoryBean
或另一个关联的…使用bean的名称。使用@Qualifier
。。。另外,我建议不要使用FactoryBean
,而是将RestTemplateBuilder
注入@Bean
方法中。我应该在哪里使用@Qualifier
?在FactoryBean
implementations上?构造函数参数。我想你的意思是DocumentServiceBackOffice(@Qualifier RestTemplate RestTemplate)
。但是,我不太明白这个@Qualifier
是如何与FactoryBean
或其他相关联的……使用bean的名称。有没有更优雅的方法来“限定”构造函数参数?我的意思是不写文字字符串……singleton呢?您可以创建自己的限定符注释(我建议您阅读Spring参考指南,其中解释了所有这些)。我没有收到你的单例注释。在我的FactoryBean中。isSingleton
返回true
。我怎样才能得到注入的rest模板是单例的呢?这是@Bean
方法的默认值。。。我强烈建议大家阅读《Spring和Spring引导参考指南》,因为所有这些问题都在这里得到了解答。有没有更优雅的方法来“限定”构造函数参数?我的意思是不写文字字符串……singleton呢?您可以创建自己的限定符注释(我建议您阅读Spring参考指南,其中解释了所有这些)。我没有收到你的单例注释。在我的FactoryBean中。isSingleton
返回true
。我怎样才能得到注入的rest模板是单例的呢?这是@Bean
方法的默认值。。。我强烈建议大家阅读《Spring和Spring Boot参考指南》,因为所有这些问题都在这里得到了解答。