Ответ 1
Я не уверен, что вы пытаетесь сделать, но из того, что я понимаю, вы хотите инициализировать свой bean данными в аннотации точки вставки или во время выполнения через программный поиск. Вы можете сделать это, используя метаданные InjectionPoint
в вашем bean (единственным ограничением будет размещение вашего bean в зависимой области)
Вы можете сделать что-то вроде этого.
Сначала создайте квалификатор с необязательным значением.
@Qualifier
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RUNTIME)
@Documented
public @interface Initialized {
@Nonbinding int value() default 0; // int value will be store here
}
Вы должны добавить этот классификатор на свой bean и проанализировать InjectionPoint
во время создания.
@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;
}
}
Теперь вы можете ввести инициализированный номер следующим образом:
@Inject
@Initialized(8)
MyNumber number;
Если вы хотите определить значение инициализации во время выполнения, вам придется использовать программный поиск:
Сначала создайте литерал аннотации для `@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;
}
}
Затем вы можете использовать Instance
для создания bean.
public class ConsumingBean {
@Inject
@Any
Instance<MyNumber> myNumberInstance;
public MyNumber getMyNumberBeanFor(int value) {
return myNumberInstance.select(new InitializedLiteral(value)).get();
}
...
}
Помните, что это работает, только если MyNumber
находится в зависимой области видимости, что имеет смысл, поскольку это единственный способ изменить значение инициализации при каждой инъекции.