Ответ
ApplicationContext в Spring является реализацией Принципа инверсии зависимостей (Dependency Inversion Principle, DIP).
Как это работает: DIP состоит из двух утверждений:
- Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
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) предоставляет её.