#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;