我有一个自定义的限定词注释
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyQualifier {
MyQualiferEnum value();
}
还有一些豆子
@Component
@Scope("prototype")
@MyQualifier(MyQualifierEnum.BLACK)
public class BlackBean {
@Component
@Scope("prototype")
@MyQualifier(MyQualifierEnum.WHITE)
public class WhiteBean {
我尝试@Lookup,但是它依赖于bean名称或类,并且我无法传递批注,并且其属性属于lookup-method
然后我尝试
context.getgetBeansWithAnnotation(MyQualifier.class)
但这会导致所有@MyQualifier实例化对我来说更糟。
我无法引入@ MyQualifierBlack,@ MyQualiferWhite等单独的注释,我确实需要枚举,因此如何在运行时注入原型bean取决于MyQualifierEnum值(例如MyQualifierEnum.BLACK),而无需对其他@MyQualifier进行不必要的初始化豆子?
答案 0 :(得分:0)
以下设置仅使用JSR-330批注。我还没有在春季进行测试,但是可以使用例如hk2作为实现:
@MyQualifier(MyQualifierEnum.BLACK)
// Framework-specific annotations, e.g. @Component/@Service and @Scope
public class BlackService implements QualifiableService { }
@MyQualifier(MyQualifierEnum.WHITE)
// Framework-specific annotations, e.g. @Component/@Service and @Scope
public class WhiteService implements QualifiableService { }
@Qualifier
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyQualifier {
public static enum MyQualifierEnum {
WHITE, BLACK;
}
MyQualifier.MyQualifierEnum value();
}
// Framework-specific annotations
public interface QualifiableService { }
// Framework-specific annotations, e.g. @Component/@Service and @Scope
public class TestComponent {
@MyQualifier(MyQualifierEnum.BLACK)
@Inject
private QualifiableService black;
@MyQualifier(MyQualifierEnum.WHITE)
@Inject
private QualifiableService white;
@MyQualifier(MyQualifierEnum.WHITE)
@Inject
private Provider<QualifiableService> whiteProvider;
@MyQualifier(MyQualifierEnum.BLACK)
@Inject
private Provider<QualifiableService> blackProvider;
void test() {
final QualifiableService white = whiteProvider.get();
final QualifiableService black = blackProvider.get();
}
}
请确保您同时注册了两种实现方式(例如您的案例中的软件包扫描),并通过限定符注入了正确的实现方式。注释的equals实现应足以确保注入了正确的组件。
在使用范围较小的情况下(例如原型范围),使用(合格的)Provider
似乎是最简单的解决方案。另外,您可以尝试注入代理(例如,使用springs代理机制)。