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

时间:2015-11-30 10:25:46

标签: java spring spring-mvc spring-boot autowired

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

我有几个实现的接口。实现使用@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();
    }

我怎样才能实现这一目标?你有什么建议? 谢谢!

2 个答案:

答案 0 :(得分:8)

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

如果您有名为Example的接口

public interface Example {

}

两个实现:

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

}

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

}

您可以拥有Example注入的bean的地图:

@Component
public class ExampleConsumer {

    private final Map<String, Example> examples;

    @Autowired
    public ExampleConsumer(Map<String, Example> examples) {
        this.examples = examples;
    }
}

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

  • "foo" - &gt; FooExample实例
  • "bar" - &gt; BarExample实例

答案 1 :(得分:0)

这也可以

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”-> FooExample实例 “ bar”-> BarExample实例