我可以根据Enum进行注射吗?

时间:2015-01-15 17:14:44

标签: java spring enums spring-3

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

@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

2 个答案:

答案 0 :(得分:0)

我认为这不会奏效。

首先,@ServicevalueString,而不是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的源代码就可以看到它是如何完成的。