Say I want a timestamp that represents now. I can't create it at startup because at startup nothing knows when now is. I also don't want to hardcode the timestamp because I don't want to be tied to a particular timestamp implementation. All I want is a string that represents now. So long as that's formatted correctly I don't want to know what class implemented it.
This can be achieved with an injectable factory. The abstract factory pattern structure works for this even without a hierarchy. The code that knows when doesn't know what. The code that knows what doesn't know when. This can achieve the same lazy initialisation as a singleton pattern without globals because when may never happen.
Pass me an object with a method that will build what I need when I ask for it. Just be careful to keep the thing you pass me focused on my needs. Pass me something that builds or finds everything's needs and you've reinvented the service locator pattern.
The above might seem trivial at first but you should realize that the same pattern that gave you one time stamp could also give you an entire object graph constructed on demand that is now just waiting for you to call start.
If you're a dependency injection purist you can also keep the call to construct and the call to start separate. "Now" just becomes your composition root for this on demand object graph.