This document provides an overview of dependency injection and related concepts like inversion of control and aspect oriented programming. It discusses what dependency injection is, when and why to use it, and examples of how it can make code more organized and flexible. Specifically, it explains how dependency injection frameworks can manage object creation through configuration rather than code, allowing dependencies to be easily swapped. It also describes how inversion of control "flips" code to externalize default values and dependencies, and how aspect oriented programming allows cross-cutting concerns to be modularized.