При создании экземпляра объёкта через
new
вы просто создаёте экземпляр объекта т.к. это конструкция самого языка. Если этот объект нужно создавать как-то специфически, к примеру если надо передавать что-то в конструктор или как-то дополнительно конфигурировать и т.п. - всё это ваша ответственность. Если вам понадобится этот же объект где-то в другом месте проекта - то передача его туда - тоже ваша ответственность.
Dependency injection container, в отличие от этого обеспечивает следующие задачи:
- Централизованное хранилище объектов и интерфейс для их получения
- Автоматическое корректное создание сконфигурированных экземпляров объектов
Конкретные реализации могут предоставлять дополнительные сервисы, но описанные выше - основные. Конечно, внутри там в конечном итоге тот же
new
, просто логика создания, конфигурирования и хранения объектов вынесена в отдельную стандартизированную сущность которой можно и нужно пользоваться для упрощения и улучшения качества своего кода.