Ответ 1
getBean()
чувствителен к регистру, однако Spring использует пользовательскую стратегию наименования bean для классов @Component
и @Bean
. См. 4.10.5 Именование автоопределенных компонентов:
Когда компонент автоопределяется как часть процесса сканирования, его имя bean генерируется стратегией
BeanNameGenerator
[...]. По умолчанию любая аннотация Spring стереотипа (@Component
,@Repository
,@Service
и@Controller
), которая содержит значениеname
, предоставит это имя соответствующему определению bean.Если такая аннотация не содержит значения
name
или для любого другого обнаруженного компонента (например, обнаруженного пользовательскими фильтрами), генератор имен по умолчанию bean возвращает некапитализированное неквалифицированное имя класса.
И для @Configuration
/@Bean
см. 4.12.4.5 Настройка bean именования:
По умолчанию классы конфигурации используют имя метода
@Bean
как имя полученного bean. Однако эту функцию можно переопределить с помощью атрибутаname
.
Вернемся к вашему вопросу. Поскольку ваш класс не соответствует соглашениям об именах Java (имена верблюжьих имен) Spring использует необычное имя для bean, это будет работать:
getBean("TEST")
Однако, если вы используете ожидаемое именование (@Component class Test { }
), вы должны использовать идентификаторы нижнего регистра:
getBean("TEST")
Более того, если ваше имя более сложное, применяется некапитализированный синтаксис верблюда (продолжая цитировать Spring documentation):
[...] Например, если были обнаружены следующие два компонента, имена будут
myMovieLister
иmovieFinderImpl
:
@Service("myMovieLister")
public class SimpleMovieLister {
// ...
}
@Repository
public class MovieFinderImpl implements MovieFinder {
// ...
}