Najpierw należy opisywanie konstruktora dla SomeClass
:
class SomeClass {
@Inject
SomeClass(@Named("JDBC URL") String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
}
wolę używać niestandardowych adnotacji, tak:
class SomeClass {
@Inject
SomeClass(@JdbcUrl String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface JdbcUrl {}
}
Następnie trzeba zapewnić wiążący w module :
public class SomeModule extends AbstractModule {
private final String jdbcUrl; // set in constructor
protected void configure() {
bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
}
}
Następnie, gdy Guice tworzy SomeClass, wprowadzi parametr. Na przykład, jeśli SomeOtherClass zależy SomeClass:
class SomeOtherClass {
@Inject
SomeOtherClass(SomeClass someClass) {
this.someClass = someClass;
}
Często, kiedy myślisz, że chcesz wprowadzić ciąg znaków, chcesz wstrzyknąć obiekt. Na przykład, jeśli ciąg jest adresem URL, często wstrzykuję URI z adnotacją wiążącą.
To wszystko zakłada, że istnieje pewna stała wartość, którą można zdefiniować w czasie tworzenia modułu dla ciągu. Jeśli wartość nie jest dostępna w czasie tworzenia modułu, możesz użyć AssistedInject.
DI (Injection Injection) z tymi wszystkimi trikami sprawia, że czytanie kodu jest trudniejsze, utracił swój pierwotny cel. w większości przypadków NIE jest to zależne od wstrzyknięcia zależności, utrzymuj kontekst w jednym miejscu. Ułatwia to konserwację. –