Tôi không chắc chắn những gì bạn đang cố gắng làm, nhưng từ những gì tôi hiểu bạn muốn khởi tạo bean của bạn với dữ liệu trong chú thích điểm tiêm hoặc thời gian chạy qua tra cứu có lập trình. Bạn có thể thực hiện việc này bằng cách sử dụng dữ liệu meta InjectionPoint
trong bean của bạn (hạn chế duy nhất là đặt bean của bạn trong phạm vi phụ thuộc)
Bạn có thể làm điều gì đó như thế này.
Trước tiên hãy tạo vòng loại có giá trị không ràng buộc.
@Qualifier
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RUNTIME)
@Documented
public @interface Initialized {
@Nonbinding int value() default 0; // int value will be store here
}
Bạn phải thêm vòng loại này vào hạt của mình và phân tích InjectionPoint
khi tạo.
@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;
}
}
Bây giờ bạn có thể tiêm một số khởi tạo như thế này:
@Inject
@Initialized(8)
MyNumber number;
Nếu bạn muốn quyết định giá trị khởi tạo trong thời gian chạy, bạn sẽ phải sử dụng tra cứu theo chương trình:
Đầu tiên tạo chữ chú thích cho `@ 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;
}
}
Sau đó, bạn có thể sử dụng Instance
để tạo hạt của bạn.
public class ConsumingBean {
@Inject
@Any
Instance<MyNumber> myNumberInstance;
public MyNumber getMyNumberBeanFor(int value) {
return myNumberInstance.select(new InitializedLiteral(value)).get();
}
...
}
Ghi làm việc này chỉ khi MyNumber
là trong phạm vi phụ thuộc có ý nghĩa bởi vì đó là cách duy nhất để thay đổi giá trị khởi tạo ở từng tiêm.
rất tốt, +1, phiếu bầu của tôi !!! :) – Delfino
@Antoine, ví dụ bạn cung cấp đang hoạt động tốt, nhưng nếu có thể linh hoạt như bỏ qua sử dụng chú thích đã khởi tạo trong khi tiêm lớp MyNumber từ một số lớp nếu không cần truyền tham số? –