Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 所需的单个bean,但在简单的spring引导应用程序中找到了2个_Java_Spring_Spring Boot - Fatal编程技术网

Java 所需的单个bean,但在简单的spring引导应用程序中找到了2个

Java 所需的单个bean,但在简单的spring引导应用程序中找到了2个,java,spring,spring-boot,Java,Spring,Spring Boot,我不熟悉弹簧靴。因此,我正在开发一个简单的应用程序,其中我有两个服务EnglishLanguageService和SpanishLanguageService。最后,我想在应用程序运行时打印Hello和Hola,但我收到了错误 Parameter 0 of constructor in controller.ConstructorInjectedController required a single bean, but 2 were found: - profileEnglishLan

我不熟悉弹簧靴。因此,我正在开发一个简单的应用程序,其中我有两个服务
EnglishLanguageService
SpanishLanguageService
。最后,我想在应用程序运行时打印
Hello
Hola
,但我收到了错误

Parameter 0 of constructor in controller.ConstructorInjectedController required a single bean, but 2 were found:
    - profileEnglishLanguageService: defined in file [/Users/user/Downloads/depdency-injection-example/target/classes/services/EnglishLanguageService.class]
    - profileSpanishLanguageService: defined in file [/Users/user/Downloads/depdency-injection-example/target/classes/services/SpanishLanguageService.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
我不确定我会错在哪里。我将把我的代码粘贴到下面

主要应用

@SpringBootApplication
@ComponentScan(basePackages= {"controller" , "services"})
public class DepdencyInjectionExampleApplication {

    public static void main(String[] args) {
        // returns application context
        ApplicationContext ctx = SpringApplication.run(DepdencyInjectionExampleApplication.class, args);

        System.out.println(ctx.getBean(PropertyInjectedController.class).getGreeting());
        System.out.println(ctx.getBean(ConstructorInjectedController.class).getGreetings());

    }
ConstructorInjectedController类

@Component
public class ConstructorInjectedController {

    private final GreetingService greetingService;

    public ConstructorInjectedController(GreetingService greetingService) {
        this.greetingService = greetingService;
    }

    public String getGreetings() {
        return greetingService.sayGreetings();
    }
PropertyInjectedControllerClass

@Controller
public class PropertyInjectedController {

    public GreetingService greetingService;

    public String getGreeting() {
        return greetingService.sayGreetings();
    }

}
迎宾服务接口

public interface GreetingService {

    String sayGreetings();

}
英语服务班

@Service
public class EnglishLanguageService implements GreetingService {

    private GreetingService greetingService;

    public EnglishLanguageService(@Qualifier("english")
                                                 GreetingService greetingService){
        this.greetingService = greetingService;
    }

    @Override
    public String sayGreetings() {
        return greetingService.sayGreetings();
    }
英语服务

@Profile("english")
public class EnglishServiceImpl implements GreetingService {
    @Override
    public String sayGreetings() {
        return "Hello";
    }
@Profile("spanish")
public class SpanishServiceImpl implements GreetingService {
    @Override
    public String sayGreetings() {
        return "Hola";
    }
}
西班牙语服务

@Service
public class SpanishLanguageService implements GreetingService {

    private GreetingService greetingService;

    public SpanishLanguageService(@Qualifier("spanish")
                                                 GreetingService greetingService){
        this.greetingService = greetingService;
    }
    @Override
    public String sayGreetings() {
        return greetingService.sayGreetings();
    }
西班牙语服务impl

@Profile("english")
public class EnglishServiceImpl implements GreetingService {
    @Override
    public String sayGreetings() {
        return "Hello";
    }
@Profile("spanish")
public class SpanishServiceImpl implements GreetingService {
    @Override
    public String sayGreetings() {
        return "Hola";
    }
}

您使用的注释是错误的
@Profile
用于完全不同于您认为应该删除的内容

您基本上是在对spring说“请在X类中插入一个特定的问候服务”

现在spring不知道您想要哪个bean,因为您有两个不同的bean实现同一个接口。因此,我们使用
@Qualifier
注释来标记bean,并在注入期间将其作为目标

首先,您的实现应该具有
@服务
@组件
,以便spring在组件扫描期间找到它,并将其实例化为spring管理的bean。这与
@限定符相结合,因此我们对其进行标记,以便稍后在注入过程中选择此标记:

@Component
@Qualifier("english")
public class EnglishServiceImpl implements GreetingService {

    @Override
    public String sayGreetings() {
        return "Hello";
    }
}
在这里,我们注入问候服务,并使用限定符告诉spring我们要在可用的bean中注入哪个bean

@Service
public class EnglishLanguageService implements GreetingService {

    private GreetingService greetingService;

    public SpanishLanguageService(@Qualifier("english") GreetingService greetingService){
        this.greetingService = greetingService;
    }

    @Override
    public String sayGreetings() {
        return greetingService.sayGreetings();
    }
}

我已经完全按照你说的做了,但是现在它说它看到了4个不同的bean,而不是一个成员,你需要在你想要注入它的每个格子上使用限定符,也在你的控制器中。