В каких классах Spring реализуются методы, аннотированные @Bean?

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

Ответ

Методы, аннотированные @Bean, реализуются в классах конфигурации Spring, которые помечены аннотацией @Configuration.

Назначение: Эти методы определяют логику создания и настройки экземпляров объектов (бинов), которые затем управляются Spring IoC-контейнером.

Пример конфигурационного класса:

@Configuration // Указывает, что класс содержит конфигурацию бинов
public class AppConfig {

    // Метод создает бин типа DataSource
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUrl("jdbc:h2:mem:testdb");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        return dataSource;
    }

    // Метод создает бин типа JdbcTemplate, зависящий от бина dataSource
    // Spring автоматически внедрит зависимость (DataSource) в параметр метода
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

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

  1. @Configuration сообщает Spring, что нужно обработать класс и вызвать его @Bean-методы для построения контекста.
  2. @Bean указывает, что метод возвращает объект, который должен быть зарегистрирован как бин в контексте приложения.
  3. Внедрение зависимостей работает через параметры метода. Spring автоматически найдет и передаст требуемый бин (как в примере с jdbcTemplate(DataSource dataSource)).
  4. По умолчанию имя бина совпадает с именем метода (dataSource, jdbcTemplate), но его можно задать явно: @Bean(name = "myDataSource").