/ / Ін'єкційний клас <T> за допомогою guice - java, залежність-ін'єкція, guice

Ін'єкційний клас <T> з використанням guice-java, injection-dependency, guice

Я "працюю над реалізацією DI, конкретно введення конструктора за допомогою доказів". У мене виникають труднощі з розумінням того, як я можу ввести тип класу для загального в конструктор.

Мій клас такий:

public class Foo<T> {

private Class<T> clazz;

Foo(Class<T> clazz) {
this.clazz = clazz;
}
}

Чи можу я використовувати guice для введення типу класу в конструктор під час виконання? Простіше кажучи, чи можу я використовувати настрій для введення в конструктор Foo?

Відповіді:

1 для відповіді № 1

Так, ви можете зробити це за допомогою Guice "s вбудована ін'єкція від TypeLiteralс

public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector();

Test<Integer> testInt = injector.getInstance(Key.get(new TypeLiteral<Test<Integer>>() {}));
testInt.action();

Test<String> testString = injector.getInstance(Key.get(new TypeLiteral<Test<String>>() {}));
testString.action();
}

public static class Test<T> {
private final Class<? super T> clazz;

@Inject
public Test(TypeLiteral<T> literal) {
this.clazz = literal.getRawType();
}

public void action() {
System.out.println(clazz);
}
}
}

Я не дуже впевнений, чому getRawType() повертає Class<? super T>, ні Class<T>, правда.


0 для відповіді № 2

використовувати

bind(new TypeLiteral<Class<SomeClass>>() {}).toInstance(SomeClass.class);

налаштувати Guice для введення SomeCLass.class в конструктор

Foo<SomeClass>