我们有一些遗留代码,我试图找到一种清理方法。我想到的一个解决方案是,也许我可以根据给定的枚举值注入自定义处理程序。我可以根据枚举来限定注射剂吗?我认为这样的事情可能是(伪代码)
@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
答案 0 :(得分:0)
我认为这不会奏效。
首先,@Service
的value
是String
,而不是Enum[]
。并且,它只是建议为该服务类注册的bean的名称。
相反,我认为您可能想要使用的是@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。
答案 1 :(得分:0)
好吧,您可以尝试创建自己的验证(是的,即使使用枚举),然后提供自己的BeanPostProcessor来完成工作并将值注入注释字段。
有很多Spring BeanPostProcessors,所以只需浏览Spring的源代码就可以看到它是如何完成的。