Является ли spring случайным случаем getbean или нет?

когда я использую getBean("test")

У меня есть класс вроде

@Component
public class TEST {
}

можно загрузить этот bean?

Ответ 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 {
  // ...
}

Ответ 2

@Component по умолчанию используется AnnotationBeanNameGenerator, который, если явно не указано имя, будет использовать метод Introspector.decapitalize() для bean ClassName, чтобы получить имя для bean. Обычно класс с именем типа "Тест" даст ему bean имя "test". Но decapitalize имеет любопытство:

Это обычно означает преобразование первого символа из верхнего регистра в нижний регистр, но в (необычном) специальном случае, когда есть больше, чем один символ и как первый, так и второй символы являются верхним регистром, мы оставляем это в покое.

Итак, ваш class TEST получит bean имя TEST.