Non sono sicuro di cosa si sta provando a fare, ma da quello che capisco si desidera inizializzare il bean con i dati nell'annotazione del punto di iniezione o in fase di esecuzione tramite la ricerca programmatica. È possibile farlo utilizzando InjectionPoint
meta dati nel vostro fagioli (l'unico vincolo sarà quello di mettere il fagiolo in ambito dipendente)
si può fare qualcosa di simile.
Prima creare un qualificatore con un valore non vincolante.
@Qualifier
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RUNTIME)
@Documented
public @interface Initialized {
@Nonbinding int value() default 0; // int value will be store here
}
si deve aggiungere questo qualificatore sul tuo fagioli e analizzare InjectionPoint
al momento della creazione.
@Initialized
public class MyNumber {
int number;
private int extractValue(InjectionPoint ip) {
for (Annotation annotation : ip.getQualifiers()) {
if (annotation.annotationType().equals(Initialized.class))
return ((Initialized) annotation).value();
}
throw new IllegalStateException("No @Initialized on InjectionPoint");
}
@Inject
public MyNumber(InjectionPoint ip) {
this.number = extractValue(ip);
}
public String toString() {
return "Your number is: " + number;
}
}
Ora è possibile iniettare un numero inizializzato in questo modo:
@Inject
@Initialized(8)
MyNumber number;
Se si vuole decidere il valore di inizializzazione in fase di esecuzione, dovrete usare ricerca programmatica:
Innanzitutto creare l'annotazione letterale `@ Initialized``
public class InitializedLiteral extends AnnotationLiteral<Initialized> implements Initialized {
private int value;
public InitializedLiteral(int value) {
this.value = value;
}
@Override
public int value() {
return value;
}
}
Quindi è possibile utilizzare Instance
per creare il tuo bean.
public class ConsumingBean {
@Inject
@Any
Instance<MyNumber> myNumberInstance;
public MyNumber getMyNumberBeanFor(int value) {
return myNumberInstance.select(new InitializedLiteral(value)).get();
}
...
}
Ricordare questo funziona solo se MyNumber
è portata dipendente che ha senso perché è l'unico modo per modificare il valore di inizializzazione per ogni iniezione.
molto buono, +1, il mio voto !!! :) – Delfino
@Antoine, l'esempio che hai fornito sta funzionando bene, ma se ci può essere flessibilità come saltare l'annotazione Inizializzata mentre si inietta la classe MyNumber da alcune classi se non è necessario passare il parametro? –