Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 具有多个接口实现的Spring Autowire Bean,在方法中定义实现_Java_Spring_Spring Mvc_Spring Boot_Autowired - Fatal编程技术网

Java 具有多个接口实现的Spring Autowire Bean,在方法中定义实现

Java 具有多个接口实现的Spring Autowire Bean,在方法中定义实现,java,spring,spring-mvc,spring-boot,autowired,Java,Spring,Spring Mvc,Spring Boot,Autowired,我不熟悉spring和spring boot,所以希望这不是一个愚蠢的问题 我有一个带有多个实现的接口。实现使用@组件(“nameofinpl”)进行注释 我的目标是用选定的实现自动连接bean。在正常情况下,我可以使用@Autowired@Qualifier(“NameOfImpl”)来实现,但我的问题是我想在如下方法中选择一个实现: public void doSomethingMethod(){ for(String line: configFile){

我不熟悉spring和spring boot,所以希望这不是一个愚蠢的问题

我有一个带有多个实现的接口。实现使用
@组件(“nameofinpl”)
进行注释

我的目标是用选定的实现自动连接bean。在正常情况下,我可以使用
@Autowired@Qualifier(“NameOfImpl”)
来实现,但我的问题是我想在如下方法中选择一个实现:

public void doSomethingMethod(){ 
      for(String line: configFile){
                String[] values = line.split(";");

                if (values[0].equals("A")) {
                    //here I want to select an bean implementation

                }
                else if (values[0].equals("B")) {
                    //here I want to select another bean implementation

                }
      }
      bean.doSomething();
    }
我怎样才能做到这一点?你有什么建议?
谢谢大家!

您可以要求Spring注入bean的
映射。地图中的键将是bean的名称

如果您有一个名为
示例的接口

public interface Example {

}
和两个实现:

@Component("foo")
public class FooExample implements Example {

}

@Component("bar")
public class BarExample implements Example {

}
您可以插入
示例
bean的映射:

@Component
public class ExampleConsumer {

    private final Map<String, Example> examples;

    @Autowired
    public ExampleConsumer(Map<String, Example> examples) {
        this.examples = examples;
    }
}
@组件
公共类示例消费者{
私人最终地图示例;
@自动连线
公共示例消费者(地图示例){
这个例子=例子;
}
}
在这种情况下,地图将包含两个条目:

  • “foo”
    ->
    FooExample
    实例
  • “bar”
    ->
    BarExample
    实例
这也在起作用

public interface Example {

}

@Component("foo")
public class FooExample implements Example {

}

@Component("bar")
public class BarExample implements Example {

}
您可以简单地自动连接它们

@Component
public class ExampleConsumer {

 @Autowired
    private final Map<String, Example> examples;


}
@组件
公共类示例消费者{
@自动连线
私人最终地图示例;
}
“foo”->foo示例实例
“bar”->BarExample instance

您可以删除自动连接,因为您正在手动实例化实现。我的目标不是手动实例化它们。使用
new
意味着实例化..是的,我知道,我需要一些东西,而不是使用new Impl();我编辑了帖子,看看这个方法