Почему не работает @Qualifier в @Service?

211
27 февраля 2019, 02:10

Есть интерфейс

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, то всё магическим образом начинает работать, подскажите в чём здесь магия, за ранее спасибо :)

Answer 1

В вашем примере AnimalService вообще никак не задействован. Строка Animal animal = applicationContext.getBean(Animal.class) пытается получить из контекста бин класса Animal, а там таких два. Исправьте на

Animal animal = applicationContext.getBean("kitty", Animal.class)

или на

AnimalService animalService = applicationContext.getBean(AnimalService.class)
Answer 2

Вы создали класс сервис AnimalService и указали в нём @Qualifier, но этот сервис вы нигде не используете, а сразу в Main вызываете Animal.

Попробуйте в Main получать bean AnimalService, а затем из него получать нужный Animal путём вызова метода getAnimal()

READ ALSO
Не сколлится меню

Не сколлится меню

Колллеги, делаю сайтПочему-то не скроллится меню в мобильной версии от 320 до 425 - как буд-то выставлена где-то захардкоженная высота

221
Как сверстать такой заголовок?

Как сверстать такой заголовок?

Подскажите, как сверстать такой заголовок, с двум линиями с боку, только чтоб линии при уменьшении экрана не уплывали

250
Правильная организация наследования

Правильная организация наследования

Пытаюсь организовать наследование такого типа (Напиток > Алкогольный/Без алкогольный > Пиво/Вода (к определенным функциям))

209
AJAX URL JSON. Параметры URL при GET запросе

AJAX URL JSON. Параметры URL при GET запросе

Доброго времени суток Стаковцы! Где можно почитать про параметры передаваемые в url, их именование и комбинирование"https://some_server

239