Связаны ли принципы ООП с фреймворком Spring?

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

Ответ

Да, Spring активно использует и поощряет применение принципов объектно-ориентированного программирования (ООП), хотя и не является исключительно ООП-фреймворком.

Как Spring реализует принципы ООП:

  1. Инкапсуляция:

    • Классы-компоненты (бины) инкапсулируют свою логику. Внешние зависимости не создаются внутри класса, а внедряются (Dependency Injection).
  2. Абстракция:

    • Spring построен на работе с интерфейсами, а не с конкретными реализациями.
    • Аннотации (например, @Service, @Repository) абстрагируют детали создания и настройки бинов.
  3. Наследование и полиморфизм:

    • Широко используются интерфейсы. Внедряя зависимость через интерфейс, вы можете легко подменить реализацию (полиморфизм).

Практический пример (Dependency Injection как композиция):

// Интерфейс (абстракция)
public interface NotificationService {
    void send(String message);
}

// Конкретная реализация
@Service // Spring-бин
public class EmailService implements NotificationService {
    @Override
    public void send(String message) {
        // логика отправки email
    }
}

// Класс, использующий зависимость (композиция через DI)
@Service
public class OrderService {
    private final NotificationService notifier; // Зависимость через интерфейс

    @Autowired // Внедрение зависимости (конструкторный DI)
    public OrderService(NotificationService notifier) {
        this.notifier = notifier;
    }

    public void confirmOrder(Order order) {
        // бизнес-логика
        notifier.send("Заказ подтвержден"); // Полиморфный вызов
    }
}

Важно: Spring также использует аспектно-ориентированное программирование (AOP) для сквозной функциональности, что является дополнением к классическому ООП.