Dependency Injection with Guice: Something that isn't covered by any tutorial

dependency-injection, guice, java

Solution

It might help to split dependencies from data.

- Dependencies are often services: databases, clocks, and RPC stubs. Plus all of the application code layered on these: `UserAuthenticator`, `PaymentHandler`, and `EmailGateway`.

- Data is just that: a `Date`, a `Map<String,InetAddress>` or even a `Customer`. These are simple, in-memory domain objects.

DI is naturally best suited for the dependency side of things. You should continue to use `new` for your data model classes.

Problem

i just tinkered around with Google Guice for Dependency Injection and started integrating it into my existing application. So far, so good. I have many classes which need, beside their dependencies, Strings, DataSources, et cetera. I know there are NamedBindings, but i really do not want to create an annotation for every simple String i have to pass to the constructor for each class. Then, there is a thing called AssistedInject, creating Factory implementions for me. Wow, but i still have to define the interface of the factory. Thats okay for classes which DO HAVE dependencies, but what about this example class: ``` public class FooBarClass { public FooBarClass(String name, String anotherOne) { // Some stuff } } ``` There are cases where i am in doubt how to use Guice or, more generally, DI the right way. "Often i hear: XYZ Framework is the new new." But this implicit that i have to create every instance with the DI framework. Only one instance is required What if i need only one instance of this class? This class has absolutly no dependencies beside two Strings. Think about a Shutdown Hook which will be instanciated only once and passed to the JVM as my Shutdown Hook. Should i create this instance with Guice? This looks very dumb to me, because there is nothing to inject, but i have to write a factory interface to pass Guide both parameters and have to create an interface for my FooBarClass to use DI. Multiple instances are required The same thing applies to a case where i need multiple instances of this class. No dependencies, but i have to create a bunch of boilerplate code to get nothing out of it. This seems wrong to me. So, how i am supposed to use DI and/or Guice? Thanks a lot!

Original source