Типичное корпоративное приложение не состоит из одного единственного объекта (или бина в терминологии Spring). Даже в самом простом приложении существует несколько объектов, которые работают вместе, чтобы создать то, что конечный пользователь видит как согласованное цельное приложение. Даьше объясняется, как перейти от определения нескольких самостоятельных определений бина к полностью реализованному приложению, в котором объекты взаимодействуют друг с другом для получения результата.

Внедрение зависимостей (DI) - это процесс, при котором объекты определяют свои зависимости (то есть другие объекты, с которыми они работают) исключительно через аргументы конструктора, аргументы фабричного метода или свойства, которые устанавливаются для экземпляра объекта после его создания или возврата из фабричного метода. Затем контейнер внедряет эти зависимости при создании бина. Данный процесс по своей сути является инверсией (отсюда и название, инверсия контроля (Inversion of Control)) самого бина, самостоятельно контролирующего создание или размещение его зависимостей с помощью прямого построения классов или шаблона локатора служб (Service Locator).

Код становится чище благодаря принципу DI, а разделение более эффективным, если объектам присваиваются свои зависимости. Объект не ищет свои зависимости и не знает местоположение или класс зависимостей. В результате классы становится проще тестировать, особенно если зависимости находятся на интерфейсах или абстрактных базовых классах, что позволяет использовать реализации функции-заглушки (stub) или объекта-имитации (mock) в модульных (unit) тестах.

DI существует в двух основных вариантах: Внедрение зависимостей на основе конструктора и внедрение зависимостей на основе сеттера.