The DependencyInjection component is the glue that holds our application together. In a modern Symfony application, we rely on auto-wiring, auto-configuration, and auto-discovery to magically generate the correct dependency tree for our application. But how do those automatisms work under the hood? What if they weren’t there?