когда я использую getBean("test")
У меня есть класс вроде
@Component
public class TEST {
}
можно загрузить этот bean?
когда я использую getBean("test")
У меня есть класс вроде
@Component
public class TEST {
}
можно загрузить этот bean?
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 {
// ...
}
@Component
по умолчанию используется AnnotationBeanNameGenerator
, который, если явно не указано имя, будет использовать метод Introspector.decapitalize()
для bean ClassName, чтобы получить имя для bean. Обычно класс с именем типа "Тест" даст ему bean имя "test". Но decapitalize
имеет любопытство:
Это обычно означает преобразование первого символа из верхнего регистра в нижний регистр, но в (необычном) специальном случае, когда есть больше, чем один символ и как первый, так и второй символы являются верхним регистром, мы оставляем это в покое.
Итак, ваш class TEST
получит bean имя TEST
.