我不确定您要做什么,但据我了解,您希望使用注入点注释中的数据或在运行时通过编程查找来初始化您的 bean。您可以通过在 bean 中使用 InjectionPoint 元数据来做到这一点(唯一的限制是将您的 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 处于依赖范围内时才有效,这是有意义的,因为这是在每次注入时更改初始化值的唯一方法。