Innanzitutto è necessario annotare il costruttore per SomeClass
:
class SomeClass {
@Inject
SomeClass(@Named("JDBC URL") String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
}
Io preferisco usare le annotazioni personalizzate, in questo modo:
class SomeClass {
@Inject
SomeClass(@JdbcUrl String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface JdbcUrl {}
}
allora avete bisogno di fornire un legame nel vostro modulo :
public class SomeModule extends AbstractModule {
private final String jdbcUrl; // set in constructor
protected void configure() {
bindConstant().annotatedWith(SomeClass.JdbcUrl.class).to(jdbcUrl);
}
}
Quindi, una volta che Guice crea SomeClass, inserisce il parametro. Per esempio, se SomeOtherClass dipende SomeClass:
class SomeOtherClass {
@Inject
SomeOtherClass(SomeClass someClass) {
this.someClass = someClass;
}
Spesso, quando si pensa che si desidera iniettare una stringa, si vuole iniettare un oggetto. Ad esempio, se la stringa è un URL, inserisco spesso uno URI con un'annotazione vincolante.
Questo presuppone che esista un valore costante che è possibile definire durante la creazione del modulo per la stringa. Se il valore non è disponibile al momento della creazione del modulo, è possibile utilizzare AssistedInject.
DI (dipendenza Injection) con tutti questi trucchi rende più difficile la lettura del codice, ha perso il suo obiettivo di origine. è molto più facile iniettare la dipendenza nella maggior parte dei casi, mantenere il contesto in un unico posto. Questo rende la manutenzione molto più semplice. –