基于方法参数的自动装配

时间:2015-12-11 08:44:14

标签: java spring

我的系统正在使用各种协议。我标记了一个接口并提供了适当的实现。例如,SSHprotocolHttpProtocol都实现了Protocol。我将来可能会添加多个。现在我有一个课程如下: -

class Test {
  @Autowired
  private Protocol protocol;

  public void getProtocol(String name) {
    return protocol;
  }
}

getProtocol应根据Protocol名称返回Protocol个对象。总之,我希望Spring根据name参数自动装配特定的bean。 春天是否支持这个?我可以有多个@Autowired和相应的限定符。但这可能会让我用相应的自动装配注释编写10-15个变量。但这太多的代码使得难以管理。工厂可能是另一种选择,但如何解决我的问题?

2 个答案:

答案 0 :(得分:5)

您可以自动装配地图类型的字段,如:

@Autowired
private Map<String, Protocol> protocols;
然后,Spring将使用bean名称作为键并将bean实例作为值填充映射。所以在你的getProtocol方法中你可以做到

public void getProtocol(String name) {
    return protocols.get(name);
}

您可以通过在组件注释上指定值来调整Bean的bean名称:

@Component("http")
public class HttpProtocol ...

答案 1 :(得分:1)

您误解了@Autowired概念。分配对象的布线在创建对象后立即完成一次。

编辑:dunni的回答肯定更好,除非您想要创建协议白名单

你可以@Autowired所有协议和case他们:

class Test {
  @Autowired
  private Protocol httpProtocol;

  @Autowired
  private Protocol sshProtocol;

  public void getProtocol(String name) {
    switch(name.toLowerCase()) {
      case "ssh": return sshProtocol;
      case "http": return httpProtocol;
    }
    throw new YourException("unknown protocol "+name);
  }
}

当然,您必须将所有Protocol实现注册为具有适当名称的bean。你可以这样做:

@Configuration
class ProtocolConfiguration {

    @Bean
    public Protocol httpProtocol() {
        return new HttpProtocol();
    }

    @Bean
    public Protocol sshProtocol() {
        return new SSHProtocol();
    }
}