2016-10-11 6 views
1

Скажем, у меня есть интерфейсКак выбрать то, что прибудете осуществлению в впрыскивается в к autowired конструктор

interface IPerson {...} 

У меня есть две реализации этого интерфейса

@Component 
class Programmer implements IPerson {...} 

@Component 
class LionTamer implements IPerson {...} 

у меня есть класс, который использует Autowire инъекции

@Component 
class SomethingThatDoesStuff { 

    @Autowired 
    public SomethingThatDoesStuff (IPerson someone) { 
     ... 
    } 

} 

Как весна знает, какую реализацию нужно вводить? Есть ли способ сказать весне, какую реализацию нужно вводить? Можно ли это сделать с помощью аннотации или мне нужно определить какой-то завод? Если да, то как?

+0

'@ qualifier' будет делать – passion

+0

Если запустить приведенный выше код, в идеале вы получите ошибку Spring инициализации, как это двух реализаций для интерфейса. Как упоминалось выше, вы можете добавить имена квалификаторов для двух реализаций, а внутри @Autowire вы можете указать имя квалификатора. –

+0

Это дубликат – Snickers3192

ответ

2

Как уже упоминалось @passion, вы должны использовать фасоль именование (standard Spring IoC feature):

@Component("programmer") 
class Programmer implements IPerson {...} 

@Component("lionTamer") 
class LionTamer implements IPerson {...} 

@Component 
class SomethingThatDoesStuff { 

    @Autowired 
    public SomethingThatDoesStuff (@Qualifier("programmer") IPerson someone) { 
     ... 
    } 

}