Iniezione di dipendenza con argomenti di costruttore
-
26-12-2019 - |
Domanda
Ho un EJB come segue:
public class Bar() {
private String s;
public Bar() {
this.s = "bar";
}
@Inject public Bar(String s) {
this.s = s;
}
}
.
- .
-
Come posso iniettare quel bean usando il costruttore arg-coving in un'altra classe
Foo
? -
Quindi, definisco la classe
Foo
come EJB, con l'obiettivo di eseguire il DI per questo in un'altra classe (ad esempio, un server web).Come posso iniettare un'istanza di classeFoo
passando unString
per configurare correttamente il costruttore arg-coving upBar
come Inner-Dependency ? -
C'è un modo migliore per definire
Bar
per ottenere punti sopra?
Soluzione
L'iniezione annotata del costruttore indica il CDI che ogni volta che qualcuno richiede un'istanza di una barra da iniettare, dovrebbe utilizzare il costruttore contrassegnato con @Inject.
Il contenitore CDI tenta quindi di ottenere casi per tutti i parametri del costruttore richiesti e fallisce, perché non può affrontare "stringa".Non sa solo quale stringa intendi.
Devi aiutare il contenitore a risolvere la dipendenza utilizzando un produttore e un qualificatore per dirgli in quale corda vuoi.Ti do solo la soluzione più semplice possibile qui:
public class Bar {
@Inject
public Bar(@Named("myString") String s) {
this.s = s;
}
}
.
E poi un'altra classe (non deve essere una classe diversa, ma è molto più leggibile):
public class MyStringProducer {
@Produces
@Named("myString")
public String getMyString() {
return ...; // whatever you want ... read JSON, parse properties, randomize ...
}
}
. Altri suggerimenti
@Inject
funziona solo quando si inietta oggetti "managed
".La stringa non è un oggetto gestito, quindi questo ha vinto; t lavoro.
Tuttavia, il seguente esempio dovrebbe funzionare (ho usato qui primavera. Utilizzare il codice di Initializaton in base alla libreria che stai utilizzando):
@Named
public class Foo {
@Inject
Bar bar;
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
Foo foo = (Foo)ctx.getBean("foo");
System.out.println(foo.bar.getString());
}
}
@Named
public class Bar {
private String s;
public Bar() {
this.s = "bar";
}
@Inject
public Bar(Bar1 bar1) {
this.s = bar1.getS();
}
public String getString() {
return s;
}
}
@Named
class Bar1 {
private String s="bar1";
public String getS() {
return s;
}
}
.