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参考指南》,因为所有这些问题都在这里得到了解答。