通过自定义注释属性

时间:2019-06-14 14:59:29

标签: java spring prototype lookup

我有一个自定义的限定词注释

@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进行不必要的初始化豆子?

1 个答案:

答案 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代理机制)。