【问题标题】:Spring Autowire Bean with multiple Interface Implementations, define Implementation in method具有多个接口实现的 Spring Autowire Bean,在方法中定义实现
【发布时间】:2016-03-03 22:54:30
【问题描述】:

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

我有一个包含多个实现的接口。实现用@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();
    }

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

【问题讨论】:

  • 您可以删除自动装配,因为您正在手动实例化实现
  • 我的目标不是手动实例化它们
  • 使用new 表示实例化..
  • 是的,我知道,我需要一些东西而不是使用 new Impl();我编辑帖子

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


【解决方案1】:

你可以让 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" -> FooExample 实例
  • "bar" -> BarExample 实例

【讨论】:

    【解决方案2】:

    这也有效

    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 实例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 2017-08-18
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多