Google Guice almost has 1:1 mapping for all the Spring Dependency Injection concepts but It has a few more cool things:
1. It's all in Java. Google Guice contains all the configurations in Java code, so we don't have to deal with any xml configurations or anything.
2. Better error messages. Guice has an interceptor that cleans up and rethrows nicer stack traces. Spring just spits out everything.
3. Just-in-time binding (or Implicit binding). This means if you have a zero-arg constructor, there's no additional binding needed, just inject it! Same if you're trying to inject a constructor with multiple args that are either zero-arg constructors, or already injected, there is no need for additional configuration. Again, just inject it!
4. Eager/Lazy injection When you inject with Spring, it says I will inject nothing or all the things. There is an option in Guice to inject lazily, which means only create the subsection of the dependency graph that I need. This means a few things - you don't need those weird special Spring testing files, Guice injects way faster in testing, and you can run integration tests in Eclipse with minimal to no setup!
5. Binding by types. This is different from Spring, which binds by names. In Spring, if you accidentally bind two instances to the same name, Spring will fail silently, and will confuse you even more by taking the binding which came last (yech). Spring offers a "bind by type" option, but don't let it fool you - its underlying implementation is still a String.
Source: https://github.com/google/guice