Как Spring генерирует имя бина, если оно не задано явно?

Ответ

Если имя бина не указано явно в аннотации (например, @Component("myBean")), Spring генерирует его автоматически, используя стратегию декапитализации (lowercase first letter) имени класса.

Правила генерации имени:

  1. Для обычного класса: имя бина = имя класса с приведением первой буквы к нижнему регистру.
  2. Для классов, имя которых начинается с двух или более заглавных букв (например, URLService), имя бина сохраняется как есть (т.е., URLService), что является особым случаем.

Примеры:

@Service
public class PaymentService {} // Имя бина: "paymentService"

@Repository
public class UserRepositoryImpl {} // Имя бина: "userRepositoryImpl"

@Component
public class APIHandler {} // Имя бина: "APIHandler" (особый случай)

Важно: Если в контексте существует несколько бинов одного типа, необходимо задавать им уникальные имена явно, иначе возникнет конфликт.

Ответ 18+ 🔞

А, слушай, вот эта магия с именами бинов в Spring, она же иногда так подъебывает, что диву даёшься! Ну, типа, если ты не указал явно в аннотации @Component("myBean"), то Spring сам придумывает имя, как умеет. А стратегия у него простая, как три копейки — декапитализация, то есть первая буква имени класса становится маленькой.

Как он это делает, этот хитрый жополиз:

  1. Обычный класс: Берет имя класса, первую буковку делает строчной — всё, готово. PaymentService превращается в "paymentService". Логично же, да?
  2. Особый случай, блядь! Если имя класса начинается с ДВУХ или БОЛЬШЕ заглавных букв (ну, типа URLService или APIClient), то он оставляет его как есть, не трогает. Получается "URLService". Это чтобы всякие аббревиатуры не изнасиловать.

Смотри, как оно работает на практике:

@Service
public class PaymentService {} // Бин будет зваться: "paymentService"

@Repository
public class UserRepositoryImpl {} // А этот: "userRepositoryImpl"

@Component
public class APIHandler {} // А вот этот, сука, особый: "APIHandler" (две большие буквы вначале!)

Но вот тут, ёпта, важный момент, чтоб тебя не накрыло! Если у тебя в контексте вдруг завелось несколько бинов одного и того же типа (ну, два разных PaymentService), и ты им всем не дал уникальных имён — пиши пропало. Конфликт, исключение, всё в пизду. Spring начнёт орать, что не может выбрать, кого тебе впендюрить. Так что либо имена явно прописывай, либо не выёбывайся.