Какой принцип SOLID реализует ApplicationContext в Spring?

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

Ответ

ApplicationContext в Spring является реализацией Принципа инверсии зависимостей (Dependency Inversion Principle, DIP).

Как это работает: DIP состоит из двух утверждений:

  1. Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
  2. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

ApplicationContext выступает в роли контейнера инверсии управления (IoC), который:

  • Управляет созданием объектов (бинов).
  • Внедряет зависимости через конструктор, сеттеры или поля (@Autowired).
  • Связывает абстракции (интерфейсы) с их конкретными реализациями.

Пример реализации DIP через ApplicationContext:

// 1. Абстракция (интерфейс) - от неё зависят оба уровня.
public interface PaymentService {
    void processPayment(double amount);
}

// 2. Деталь (конкретная реализация) зависит от абстракции.
@Component
public class CreditCardService implements PaymentService {
    @Override
    public void processPayment(double amount) { /* ... */ }
}

// 3. Модуль верхнего уровня (сервис) зависит от абстракции, а не от детали.
@Service
public class OrderService {
    private final PaymentService paymentService; // Зависимость от абстракции

    // ApplicationContext внедряет конкретную реализацию (CreditCardService).
    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService; // Инъекция зависимости
    }
}

Таким образом, OrderService не создаёт CreditCardService напрямую. Зависимость инвертирована — контейнер (ApplicationContext) предоставляет её.