我可以根据枚举来限定注入吗?
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
我认为这行不通。
首先,@Service
的 value
是 String
,而不是 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 的源代码就可以了解它是如何完成的。
我们有一些遗留代码,我正在尝试找出一种清理方法。我想到的一种解决方案是,也许我可以根据我给出的枚举值注入自定义处理程序。我可以根据枚举限定注入吗?我在想可能是这样的(伪代码)
@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
我认为这行不通。
首先,@Service
的 value
是 String
,而不是 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 的源代码就可以了解它是如何完成的。