внедряющий интерфейс с несколькими реализациями в play framework

#java #dependency-injection #playframework

#java #внедрение зависимостей #playframework

Вопрос:

Я хочу внедрить интерфейс Java с помощью аннотации @Inject, но поскольку существует несколько реализаций этого интерфейса, я не понимаю, как play framework разрешит проблему, я пытаюсь найти что-то вроде аннотации квалификатора в spring, но не могу найти что-то подобное в документации play. Пожалуйста, дайте мне знать, как этого можно достичь.

 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:

Play Framework использует графический интерфейс:

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;