Что произойдёт, если пометить метод экземпляра класса аннотацией @Bean в Spring?

«Что произойдёт, если пометить метод экземпляра класса аннотацией @Bean в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пометка метода экземпляра (нестатического) аннотацией @Bean вне класса, отмеченного @Configuration, приведёт к некорректной работе Spring и является антипаттерном.

Проблемы:

  1. Нарушение контракта Spring — @Bean методы предназначены для классов @Configuration. Spring создаёт CGLIB-прокси для таких классов, чтобы обеспечить семантику синглтона (вызов метода всегда возвращает один и тот же бин).
  2. Отсутствие управления жизненным циклом — экземпляр класса, содержащий метод, сам не управляется Spring (не является бином).
  3. Возможное создание множества экземпляров — без проксирования каждый вызов метода может создавать новый объект, нарушая ожидаемую семантику бина.

Пример проблемного кода:

@Component // Или обычный класс
public class MyComponent {
    @Bean // НЕПРАВИЛЬНО! Метод в экземпляре компонента.
    public MyService myService() {
        return new MyService();
    }
}

Правильный подход: Выносите @Bean методы в отдельные классы, помеченные @Configuration.

@Configuration
public class AppConfig {
    @Bean // ПРАВИЛЬНО. Spring будет управлять вызовами этого метода.
    public MyService myService() {
        return new MyService();
    }
}