No bean named 'beanName' available, не видит @Bean
Ошибка здесь:
Book warAndPiece = context.getBean("warAndPiece", Book.class);
Создание объекта context чуть ранее(все в main(String[] args)):
ApplicationContext context = new ClassPathXmlApplicationContext("instantiation.xml");
instantiation.xml подключает аннотации:
<context:annotation-config/>
Сам @Bean:
@Bean
public Book warAndPiece(@Qualifier("warAndPieceBrochure")Brochure brochure) { // it is not recommended to set qualifier as id!
return new Book(3000, "War and Piece", "Tolstoy", brochure);
}
Он в классе Book, который аннотирован как содержащий @Bean'ы:
@Configuration
public class Book {
...
}
Полный код ошибки:
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named 'warAndPiece' available
Все, что нужно, на первый взгляд, прописано. Что я упускаю?
Дополнение:
Попробовал сделать тестовый класс конфигурации с @Bean в том же пакете, что и класс Main:
@Configuration
public class TestBeanConf {
@Bean
public TestBeanConf testBean() {
return new TestBeanConf();
}
}
На строке
context.getBean("testBean");
Кидает аналогичную ошибку.
Ответы (3 шт):
Бин warAndPiece можно инжектить через конструктор или Autowired.
Например:
@Component
// или @Service
class InjectBook {
@Autowired
private final Book warAndPiece; // то есть явно указываете идентичное имя бина
}
Или
@Component
// или @Service
class InjectBook {
@Autowired
private final ApplicationContext context;
Book book = context.getBean("warAndPiece");
}
Аннотацией @Configuration помечается класс, в котором создаётся бин, а не в котором он описывается. Класс, содержащий метод
@Bean
public Book warAndPiece(@Qualifier("warAndPieceBrochure")Brochure brochure) { // it is not recommended to set qualifier as id!
return new Book(3000, "War and Piece", "Tolstoy", brochure);
}
Помечен как @Configuration ?
Также, мне кажется, нужно @Autowired использовать с квалифаером.
Смена
<context:annotation-config/>
на
<context:component-scan base-package="ru.miron"/>
помогла. Все подключилось.