How does JIT injection differ from constructor injection? When working with optional dependencies, why is using a NO-OP implementation important? What are the ideal use cases for JIT injection?