Какие ключевые архитектурные принципы Spring?

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

Ответ

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 легко тестируются в изоляции с помощью мок-объектов.