Это очень простая программа с основным классом 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 должен быть выполнен




Вам нужно предоставить экземпляр Class конструктору AnnotationConfigApplicationContext:
new AnnotationConfigApplicationContext(StudentConfig.class);
обратите внимание, что StudentConfig.class не совпадает со строкой "StudentConfig.class".
Обратите внимание, что AnnotationConfigApplicationContext также имеет строковый конструктор (поэтому ваш код все еще компилируется), но эта строка интерпретируется как базовый пакет для автоматического сканирования, а не как имя класса конфигурации.
@ Алекс, теперь твой ответ кажется нормальным.
Дело в том, что конструктор
Stringиспользует имя пакета, так что оно также может бытьnew AnnotationConfigApplicationContext("spring")