在游戏框架中注入具有多种实现方式的接口

时间:2019-03-18 09:26:01

标签: java dependency-injection playframework

我想使用@Inject注释注入Java接口,但是由于该接口有多种实现,因此我无法获得play框架将如何解决的问题,我试图在春季找到类似qualifier注释的东西,但无法找到某些东西在游戏文档中是这样的。请让我知道如何实现。

interface i1 {
    void m1() {}
}
class c1 implements i1{}
class c2 implements i1{}

class c {
    @Inject 
    i1 i; // which instance will be injected here how to resolve this conflict.
}

1 个答案:

答案 0 :(得分:1)

播放框架使用Guice:

https://www.playframework.com/documentation/2.7.x/JavaDependencyInjection https://github.com/google/guice/wiki/Motivation

您可以通过不同的方式实现它。最简单的例子:

1。 绑定注释

如果只需要一种实现。 https://www.playframework.com/documentation/2.7.x/JavaDependencyInjection#Binding-annotations

import com.google.inject.ImplementedBy;

@ImplementedBy(c1.class)
public interface i1 {
    void m1();
}

2。 程序绑定

如果需要同一类的一些实现。类似于预选赛。您要的那个。 https://www.playframework.com/documentation/2.7.x/JavaDependencyInjection#Programmatic-bindings

import com.google.inject.AbstractModule;
import com.google.inject.name.Names;

public class Module extends AbstractModule {
  protected void configure() {

    bind(i1.class)
      .annotatedWith(Names.named("c1"))
      .to(c1.class);

    bind(i1.class)
      .annotatedWith(Names.named("c2"))
      .to(c2.class);
  }
}

稍后在代码中

@Inject @Named("c1")
i1 i;