Dependency injection decouples code by injecting dependencies through interfaces rather than instantiating dependencies directly. This improves modularity, testability and replaceability. Aspect oriented programming further decouples cross-cutting concerns from the main code by injecting additional functionality at specific join points using pointcuts and advice. Examples show logging, caching, security and translation concerns injected as aspects into classes using annotations to specify join points.