What is dependency injection, and what are the primary benefits of using it in a large-scale application?