#java #spring
Есть интерфейс package ioc.primary_annotation; public interface Animal { void display(); } его реализуют два класса package ioc.primary_annotation; import org.springframework.stereotype.Component; @Component("kitty") public class Cat implements Animal { public void display() { System.out.println("Cat.display"); } } и package ioc.primary_annotation; import org.springframework.stereotype.Component; @Component("doggi") public class Dog implements Animal { public void display() { System.out.println("Dog.display"); } } есть класс конфигурации package ioc.primary_annotation; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackages = "ioc.primary_annotation") public class AppConfig { } и сервис package ioc.primary_annotation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier;; import org.springframework.stereotype.Service; @Service public class AnimalService { @Autowired @Qualifier("kitty") private Animal animal; public AnimalService() { } public Animal getAnimal() { return animal; } public void setAnimal(Animal animal) { this.animal = animal; } } и всё это должно работать в методе main package ioc.primary_annotation; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class PrimaryMain { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); Animal animal = applicationContext.getBean(Animal.class); animal.display(); } } Но не работает, падает исключение Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'ioc.primary_annotation.Animal' available: expected single matching bean but found 2: kitty,doggi Вопрос в том почему это не работает, ведь я указал через Qualifier какой бин нжуно использовать? Если я над классом Cat или Dog укажу анотацию @Primary, то всё магическим образом начинает работать, подскажите в чём здесь магия, за ранее спасибо :)
Ответы
Ответ 1
В вашем примере AnimalService вообще никак не задействован. Строка Animal animal = applicationContext.getBean(Animal.class) пытается получить из контекста бин класса Animal, а там таких два. Исправьте на Animal animal = applicationContext.getBean("kitty", Animal.class) или на AnimalService animalService = applicationContext.getBean(AnimalService.class)Ответ 2
Вы создали класс сервис AnimalService и указали в нём @Qualifier, но этот сервис вы нигде не используете, а сразу в Main вызываете Animal. Попробуйте в Main получать bean AnimalService, а затем из него получать нужный Animal путём вызова метода getAnimal()
Комментариев нет:
Отправить комментарий