Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#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()

Комментариев нет:

Отправить комментарий