Ответ
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) или интеграции сторонних библиотек.