Ответ
Spring Framework наиболее фундаментально реализует Принцип инверсии зависимостей (Dependency Inversion Principle, DIP) — буква «D» в SOLID.
DIP состоит из двух утверждений:
- Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Как Spring реализует DIP:
- IoC-контейнер управляет созданием объектов (бинов) и их зависимостями.
- Внедрение зависимостей (DI) — это механизм реализации DIP. Зависимости предоставляются объекту извне (контейнером), а не создаются внутри него.
- Код зависит от интерфейсов, а конкретные реализации связываются контейнером.
Пример:
// Абстракция (интерфейс) - от неё зависит высокоуровневый сервис
public interface Repository {
Data findData();
}
// Деталь реализации (зависит от абстракции)
@Repository
public class JdbcRepository implements Repository {
public Data findData() { /* ... */ }
}
// Высокоуровневый сервис (зависит от абстракции, а не от деталей)
@Service
public class BusinessService {
private final Repository repository; // Зависимость от интерфейса
@Autowired // Контейнер Spring внедряет конкретную реализацию (JdbcRepository)
public BusinessService(Repository repository) {
this.repository = repository; // Принцип соблюдён
}
}
Итог: DIP, реализуемый через IoC/DI, — краеугольный камень Spring, который делает код слабосвязанным, тестируемым и гибким. Остальные принципы SOLID (как SRP, OCP) также поддерживаются, но построены на этой основе.