Это принцип проектирования, при котором поток выполнения программы контролируется фреймворком или сторонней библиотекой, а не непосредственно кодом приложения.
Основные идеи:
Пример с использованием фреймворка Spring:
java
В этом примере GreetingController не создает экземпляр HelloServiceImpl. Вместо этого, контейнер Spring (или другой IoC контейнер) создает оба объекта и передает экземпляр HelloServiceImpl в конструктор GreetingController.