Projects using Guice will have a Module class for reach module that will install dependencies.

This installation adds all the @Provides methods from external dependencies to the dependency graph at runtime AND NOT at compile time.

@Inject -> Guice uses reflection to find these annotations, creates / gets implementation instance, sets field value (amongst other things) @Named -> this is a particular instance of a class. Without it, it would be unclear where / who is injecting this implementation

  • Allows for easily injecting alternate models vs separate classes needing diff types
  • Allows using same interface @Provides -> return value (class) of method annotated