春季启动:两个FactoryBean <resttemplate>实现

时间:2018-10-08 09:24:37

标签: spring spring-boot

我刚刚创建了一个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));
        }

}

2 个答案:

答案 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;
    }

    // ...

}