我不确定您要做什么,但据我所知,您希望使用注入点注释中的数据或在运行时通过编程查找来初始化Bean。您可以通过在 Bean 中使用元数据来执行此操作(唯一的约束是将 Bean 置于依赖作用域中)InjectionPoint
你可以做这样的事情。
首先创建一个具有非约束值的限定符。
@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;
}
}
然后,您可以使用 来创建您的 Bean。Instance
public class ConsumingBean {
@Inject
@Any
Instance<MyNumber> myNumberInstance;
public MyNumber getMyNumberBeanFor(int value) {
return myNumberInstance.select(new InitializedLiteral(value)).get();
}
...
}
请记住,这仅在 相关范围内有效,这是有道理的,因为这是在每次注入时更改初始化值的唯一方法。MyNumber