Java @Qualifier能看穿一系列依赖项吗?
我在配置文件中声明了一些bean:Java @Qualifier能看穿一系列依赖项吗?,java,spring,Java,Spring,我在配置文件中声明了一些bean: @Bean public RestTemplate restTemplate() { return new RestTemplate(clientHttpRequestFactory()); } @Bean public ClientHttpRequestFactory clientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory factory = new HttpC
@Bean
public RestTemplate restTemplate()
{
return new RestTemplate(clientHttpRequestFactory());
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory()
{
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient());
//some config...
return factory;
}
@Bean
@Qualifier("key1")
public HttpClient httpClient()
{
//some config here too..
}
@Bean
@Qualifier("key2")
public HttpClient httpClient()
{
//some config here too..
}
然后,我想自动连接RestTemplate两次:
@Autowired
@Qualifier("key1")
RestTemplate restTemplate1;
@Autowired
@Qualifier("key2")
RestTemplate restTemplate2;
这样行吗?
既然我有一个依赖链,@Qualifier能看穿这个链直到需要注入HttpClinet吗?
我应该制作restemplate@Scope原型吗?
这将不起作用,因为您在配置类中的HttpClient上使用@Qualifier,而不是在RestTemplate上 你需要像这样的东西我是从脑子里写出来的,所以它可能不会100%起作用:
@Bean(name="key1")
public RestTemplate restTemplate1()
{
return new RestTemplate(clientHttpRequestFactory1());
}
@Bean(name="key2")
public RestTemplate restTemplate2()
{
return new RestTemplate(clientHttpRequestFactory2());
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory1()
{
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient1());
//some config...
return factory;
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory2()
{
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient2());
//some config...
return factory;
}
public HttpClient httpClient1()
{
//some config here too..
}
public HttpClient httpClient2()
{
//some config here too..
}
编辑:
可以避免代码重复,但这取决于您的特定配置,以及在使用RestTemplate时是否确实需要HttpClient和ClientHttpRequestFactory作为bean
例如:
@Bean(name = "key1")
public RestTemplate restTemplate1() {
return new RestTemplate(clientHttpRequestFactory(httpClient(/* params */)));
}
@Bean(name = "key2")
public RestTemplate restTemplate2() {
return new RestTemplate(clientHttpRequestFactory(httpClient(/* params */)));
}
public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
return factory;
}
public HttpClient httpClient(/* paramn */) {
/* create HttpClient using params */
}
所以我仍然需要复制所有依赖bean。我想我明白了:所以@Qualifier不会让我复制bean;相反,它允许我这样做,因为在春天,我不可能有两个豆子来做我刚刚发现的相同类型的事情。对吗?@Daniel如果您不将ClientHttpRequestFactory和HttpClient标记为bean,这是可能的,请参见编辑后的答案。