Ответ
Spring построен на нескольких фундаментальных принципах, обеспечивающих гибкость и удобство разработки.
1. Инверсия управления (IoC) Управление жизненным циклом объектов и их зависимостями делегируется контейнеру Spring, а не самому приложению.
2. Внедрение зависимостей (DI) Конкретная реализация IoC в Spring. Зависимости предоставляются объекту извне (инжектируются), а не создаются внутри него.
-
Внедрение через конструктор (предпочтительно):
@Service public class UserService { private final UserRepository repository; @Autowired // Необязательно с Spring 4.3+ public UserService(UserRepository repository) { this.repository = repository; } } - Внедрение через поле или сеттер: Используется реже из-за меньшей явности и сложности тестирования.
3. Аспектно-ориентированное программирование (AOP) Позволяет выносить сквозную функциональность (логирование, транзакции, безопасность) в отдельные модули — аспекты, что повышает модульность кода.
4. Модульность Фреймворк разделен на независимые модули (Spring Core, MVC, Data, Security, Boot), которые можно подключать по мере необходимости.
5. Конвенция вместо конфигурации
Минимизация объёмного XML-конфигурирования за счёт использования аннотаций (@Component, @Service, @Repository, @Autowired).
6. Простота тестирования Благодаря DI и использованию POJO (Plain Old Java Objects) компоненты Spring легко тестируются в изоляции с помощью мок-объектов.