В каком типе класса Spring нужно объявлять метод с аннотацией `@Bean`?

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

Ответ

Методы, помеченные @Bean, должны находиться в классах, аннотированных @Configuration.

@Configuration — это специализированная форма @Component, которая указывает Spring, что класс содержит конфигурацию на основе Java-кода и определения бинов.

Пример (предпочтительный способ):

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(); // Возвращаемый объект регистрируется как бин
    }

    @Bean
    public MyService myService() {
        return new MyServiceImpl(dataSource()); // Вызов метода будет проксирован для возврата одного и того же бина
    }
}

Ключевые моменты:

  • @Configuration обеспечивает проксирование вызовов @Bean-методов внутри класса. Это гарантирует, что вызов dataSource() в myService() вернет уже созданный Spring-ом singleton-бин, а не создаст новый экземпляр.
  • @Bean также можно использовать в классах с @Component, но это менее предпочтительно. В этом режиме (lite mode) вызовы методов не проксируются, что может привести к созданию нескольких экземпляров при внутренних вызовах.
  • @Bean — это аналог XML-элемента <bean/>, но реализованный на Java.