@alex Most DI takes place at object instantiation time. When you instantiate an object with dependencies, those dependencies are instantiated (and so on). This is called wiring up an app in Spring and Guice parlance. This means forgoing the new operator and using the container in the entry point for your program.
There's also the option of delaying the dependency injection. This can be done by interacting with the container as the program is running. You might delay injection because of performance via lazy loading. You might also do this to break cycles whereby two objects reference each other. One object can use the normal means of DI where as the other object (up to you which is which) must call though the container at a later date.
As a user, this should all be taken care of behind the scenes and your program starts with each component able to execute in the proper context. For something like an EJB, this means with all the datasources and JMS queue connections to do its work. On a UI, this might mean a shared EventBus. So, besides a few annotations (-at-Inject) and a little interaction with the container (getBean(), injector.get()), you shouldn't have to do any clean up or worry about byte code generation.