Spring引导不抱怨两个同名的bean

时间:2015-08-14 07:05:41

标签: java spring spring-boot

我有以下配置,其中我有两个不同配置类中具有相同名称的Spring bean。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfiguration {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration 
public class OtherRestTemplateConfiguration {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

我正在注射(和使用)这样的bean:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class SomeComponent {

    @Autowired
    private RestTemplate restTemplate;

}

现在,我的问题是:为什么Spring不抱怨有多个具有相同名称的bean?我希望这里有一个例外,并且必须添加@Primary注释以确保正在使用正确的注释。

在旁注:即使我添加@Primary,它仍然不总是注入正确的。{/ p>

2 个答案:

答案 0 :(得分:4)

其中一个bean覆盖了其他bean,因为您使用相同的名称。如果@paweł-głowacz建议使用不同的名称,那么在使用

的情况下
@Autowired
private RestTemplate myRestTemplate;

spring会抱怨因为它找到两个具有相同RestTemplate类型的bean并且不知道要使用哪个bean。然后,您将@Primary应用于其中一个。

此处有更多解释:more info

答案 1 :(得分:0)

您需要将bean命名为:

@Configuration
public class RestTemplateConfiguration {

    @Bean(name="bean1")
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@Configuration 
public class OtherRestTemplateConfiguration {

    @Bean(name="bean2")
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}