Сначала необходимо аннотировать конструктор SomeClass
:
class SomeClass {
@Inject
SomeClass(@Named("JDBC URL") String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
}
Я предпочитаю использовать пользовательские аннотации, например:
class SomeClass {
@Inject
SomeClass(@JdbcUrl String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface JdbcUrl {}
}
Тогда вам необходимо обеспечить привязку в вашем модуле :
public class SomeModule extends AbstractModule {
private final String jdbcUrl; // set in constructor
protected void configure() {
bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
}
}
Затем время Guice создает SomeClass, оно будет вводить параметр. Например, если SomeOtherClass зависит от SomeClass:
class SomeOtherClass {
@Inject
SomeOtherClass(SomeClass someClass) {
this.someClass = someClass;
}
Часто, когда вы думаете, что вы хотите, чтобы ввести строку, вы хотите, чтобы ввести объект. Например, если String является URL-адресом, я часто вставляю URI с обязательной аннотацией.
Все это предполагает, что существует некоторое постоянное значение, которое вы можете определить во время создания модуля для String. Если значение не доступно во время создания модуля, вы можете использовать AssistedInject.
DI (зависимая инъекция) со всеми этими трюками делает код чтения более сложным, потерял исходную цель. в большинстве случаев гораздо проще использовать НЕ-зависимую инъекцию, поддерживать контекст в одном месте. Это упрощает обслуживание. – 2013-08-14 23:19:43