我可以根据枚举来限定注入吗?

Can I qualify an injection based on an Enum?

我们有一些遗留代码,我正在尝试找出一种清理方法。我想到的一种解决方案是,也许我可以根据我给出的枚举值注入自定义处理程序。我可以根据枚举限定注入吗?我在想可能是这样的(伪代码)

@Service(MyEnum.MYVALUE, MyEnum.MYOTHERVALUE) // produces a handler given these enums
public class MyHandler { ... }

@Service(MyEnum.ANOTHERVALUE)
public class AnotherHandler {... }

// .... some mystical way of telling spring what my current enum context is so I can get the right handler

我认为这行不通。

首先,@ServicevalueString,而不是 Enum[]。而且,它只是建议为该服务注册的 bean 的名称 class.

相反,我认为您可能想要使用 @Qualifier。所以,你可以有这样的东西:

@Service
@Qualifier("foo")
public class FooHandler implements IHandler { ... }

@Service
@Qualifier("bar")
public class BarHandler implements IHandler { ... }

@Component
public class MyThing {
    @Autowired @Qualifier("foo")
    private IHandler handler;

    ...
}

或者,您可以创建自己的自定义限定符注释,例如:

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

@Service
@MyQualifier
public class FooHandler implements IHandler { ... }

@Component
public class MyClass {
    @Autowired @MyQualifier
    private IHandler handler;

    ...
}

有关详细信息,请参阅 Fine-tuning annotation-based autowiring with qualifiers

好吧,您可以尝试创建自己的验证(是的,即使使用枚举),然后提供您自己的 BeanPostProcessor 来完成这项工作并将值注入您的注释字段。

有很多 Spring BeanPostProcessor,因此您只需浏览 Spring 的源代码就可以了解它是如何完成的。