gpt4 book ai didi

java - 通过自定义注释属性查找原型(prototype)bean

转载 作者:行者123 更新时间:2023-12-02 04:27:47 25 4
gpt4 key购买 nike

我有一个自定义限定符注释

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyQualifier {
MyQualiferEnum value();
}

还有一些 bean

@Component
@Scope("prototype")
@MyQualifier(MyQualifierEnum.BLACK)
public class BlackBean {

@Component
@Scope("prototype")
@MyQualifier(MyQualifierEnum.WHITE)
public class WhiteBean {

我尝试@Lookup,但它依赖于bean名称或类,并且我无法将注释及其属性传递给查找方法

然后我尝试

context.getgetBeansWithAnnotation(MyQualifier.class)

但这会导致所有 @MyQualifier beans 实例化,这对我来说更糟糕。

我无法引入 @MyQualifierBlack、@MyQualiferWhite 等单独的注释,我确实需要枚举,因此如何注入(inject)原型(prototype) bean 取决于 MyQualifierEnum 值,例如 MyQualifierEnum.BLACK,在运行时无需对其他 @MyQualifier 注释进行不必要的初始化 bean ?

最佳答案

以下设置仅使用 JSR-330注释。我还没有在 Spring 测试它,但它可以使用例如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();
}
}

确保您注册了两种实现(例如,在您的情况下进行包扫描)并通过限定符注入(inject)正确的实现。 equals注释的实现应该足以确保注入(inject)正确的组件。

如果您使用较窄的范围(例如原型(prototype)范围),使用(合格的)Provider 似乎是最简单的解决方案。或者,您可以尝试注入(inject)代理(例如使用 springs 代理机制)。

关于java - 通过自定义注释属性查找原型(prototype)bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56600731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com