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

use*_*019 2 java spring spring-mvc autowired spring-boot

我是春季和春季靴子的新手,所以希望这不是一个愚蠢的问题.

我有几个实现的接口.实现注释为@Component("NameOfImpl").

我的目标是使用选定的实现自动装配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();
    }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?你有什么建议?谢谢!

And*_*son 8

你可以让Spring注入一些Map豆子.地图中的键将是bean的名称.

如果您有一个名为的接口 Example

public interface Example {

}
Run Code Online (Sandbox Code Playgroud)

两个实现:

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

}

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

}
Run Code Online (Sandbox Code Playgroud)

你可以有一张Example注入豆子的地图:

@Component
public class ExampleConsumer {

    private final Map<String, Example> examples;

    @Autowired
    public ExampleConsumer(Map<String, Example> examples) {
        this.examples = examples;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,地图将包含两个条目:

  • "foo"- > FooExample实例
  • "bar"- > BarExample实例