Dependency Injection is a tool that helps a programmer or architect design modular, independent, loosely coupled, and easily testable code. It is not a mandatory requirement, however it does tend to make software development simpler as it alleviates a lot of dependency management issues that would otherwise arise. As it decouples your components from their dependencies, it also makes it much easier to unit test those components in isolation from the rest of a larger product.
About a year ago, I posted an answer to an IoC (Inversion of Control) question here on SO. You may find the answer useful, as the concepts also apply to Dependency Injection, as IoC is simply a means of achieving DI.
Can anyone explain to me, at length, how to use IOC containers?
Additionally, here are some good references explaining DI in more detail: