2015-01-15 4 views
0

У нас есть код устаревшего кода, который я пытаюсь выяснить, как очистить. Одно из решений, о котором я подумал, заключается в том, что, возможно, я могу ввести пользовательский обработчик на основе значения перечисления, которое мне дано. Можно ли квалифицировать инъекцию на основе перечисления? Я думаю, что-то вроде этого возможно (псевдокод)Могу ли я квалифицировать инъекцию на основе 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 

ответ

0

Я не думаю, что это сработает.

Прежде всего, value для @Service является String, а не Enum[]. И он просто предлагает имя для компонента, который регистрируется для этого класса обслуживания.

Вместо этого, я думаю, вы можете использовать это @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 для более подробной информации.

+0

на самом деле не предполагал, что параметр '@ Service' был перечислением, поэтому я сказал« псевдокод », я не был уверен, что код, который я искал, был – xenoterracide

0

Ну, вы можете попытаться создать свою собственную проверку (да, даже с перечислениями), а затем предоставить свой собственный BeanPostProcessor, который выполнит задание и добавит значения в ваши аннотированные поля.

Есть много Spring BeanPostProcessors, чтобы вы могли видеть, как это делается, просматривая источники Spring.