Нет доступного bean-компонента с именем xxx

Это очень простая программа с основным классом JavaLoader и одним интерфейсом Student. Student реализуется двумя классами. Я также сделал класс конфигурации. Когда я создаю экземпляр компонента из основного класса и вызываю метод для Samir. Выбрасывается NoSuchBeanDefinitionException.

Основной класс (JavaLoader):

package spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class JavaLoader {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext appContext = new
                AnnotationConfigApplicationContext("StudentConfig.class");

        Student samir = (Student) appContext.getBean("samir", Student.class);
        System.out.println(samir.readsBook());
    }
}

StudentConfig класс:

package spring;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("spring")
public class StudentConfig {

}

Samir класс:

package spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

@Component("samir")
public class Samir implements Student{
    @Autowired
    @Qualifier("history")
    Book book;

    public Samir(Book book){
        this.book = book;
    }
    public String readsBook(){
        return book.readBook();
    }
}

Ожидаемый результат состоит в том, что метод samir.readsBook() на JavaLoader должен быть выполнен

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
776
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно предоставить экземпляр Class конструктору AnnotationConfigApplicationContext:

 new AnnotationConfigApplicationContext(StudentConfig.class);

обратите внимание, что StudentConfig.class не совпадает со строкой "StudentConfig.class".

Обратите внимание, что AnnotationConfigApplicationContext также имеет строковый конструктор (поэтому ваш код все еще компилируется), но эта строка интерпретируется как базовый пакет для автоматического сканирования, а не как имя класса конфигурации.

Дело в том, что конструктор String использует имя пакета, так что оно также может быть new AnnotationConfigApplicationContext("spring")

Karol Dowbecki 15.04.2019 13:01

@ Алекс, теперь твой ответ кажется нормальным.

Vishwa Ratna 15.04.2019 13:03

Другие вопросы по теме