Какие основные способы конфигурации бинов (beans) существуют в Spring Framework?

«Какие основные способы конфигурации бинов (beans) существуют в Spring Framework?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring предоставляет три основных подхода к конфигурации бинов, каждый со своими сценариями использования.

1. Конфигурация с помощью аннотаций (Annotation-based Configuration)

Самый распространенный современный подход. Контейнер сканирует classpath и автоматически регистрирует бины, помеченные стереотипными аннотациями.

Ключевые аннотации:

  • @Component — общая аннотация для любого бина, управляемого Spring.
  • @Service — специализация @Component для слоя бизнес-логики.
  • @Repository — для слоя доступа к данным (DAO). Добавляет трансляцию исключений JDBC в DataAccessException.
  • @Controller / @RestController — для веб-слоя (MVC контроллеры).
  • @Autowired — для автоматического связывания зависимостей (внедрения через конструктор, поле или сеттер).
  • @Value — для инъекции значений из property-файлов (${property.name}).

Пример:

@Service
public class OrderService {
    private final PaymentService paymentService; // Внедрение через конструктор предпочтительнее

    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

@Repository
public class JpaOrderRepository implements OrderRepository {
    @Value("${app.page.size:10}") // Значение из properties, по умолчанию 10
    private int pageSize;
}

2. Java-based конфигурация (Configuration Classes)

Конфигурация объявляется в Java-классах, помеченных @Configuration. Бины определяются методами с аннотацией @Bean. Этот подход обеспечивает полный контроль над процессом создания бина.

Пример:

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        // Создание и настройка сложного бина в коде
        return new HikariDataSource();
    }

    @Bean
    public OrderService orderService(PaymentService paymentService) {
        // Spring автоматически внедрит paymentService как параметр
        return new OrderService(paymentService, dataSource());
    }
}

3. XML-конфигурация (Legacy, но все еще поддерживается)

Классический способ, где бины и их зависимости описываются в XML-файле.

Пример (applicationContext.xml):

<beans>
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <property name="jdbcUrl" value="jdbc:h2:mem:testdb"/>
    </bean>

    <bean id="orderService" class="com.example.OrderService">
        <constructor-arg ref="paymentService"/>
        <constructor-arg ref="dataSource"/>
    </bean>
</beans>

Выбор подхода: Для новых проектов рекомендуется использовать комбинацию аннотаций и Java-based конфигурации. Аннотации — для простых бинов, @Configuration классы — для настройки инфраструктурных компонентов (DataSource, TransactionManager) или интеграции сторонних библиотек.