Instead of worrying about your objects dependencies you can let the IoC container inject them in your instances.
Dependency Injection through constructor:
public interface LoggerDAO { // contract methods } public class JdbcLoggerDAO implements LoggerDAO { // contract methods } public interface Logger{ // methods implementation } public class DatabaseLogger implements Logger { private final LoggerDAO loggerDAO; // DatabaseLogger depends on LoggerDAO public DatabaseLogger(LoggerDAO loggerDAO) { this.loggerDAO = loggerDAO; } // methods implementation } Container c = new MentaContainer(); c.ioc(LoggerDAO.class, JdbcLoggerDAO.class); c.ioc(Logger.class, DatabaseLogger.class).addConstructorDependency(LoggerDAO.class); Logger logger = c.get(Logger.class); // Logger will come with its dependency LoggerDAO
You can also instantiate any object with the components present in the container:
public class MyClass { private final Logger logger; public MyClass(Logger logger) { this.logger = logger; } // ... } MyClass myClass = c.instantiate(MyClass.class); // DatabaseLogger will be injected through constructor
Dependency Injection through setter:
public interface LoggerDAO { // contract methods } public class JdbcLoggerDAO implements LoggerDAO { // contract methods } public interface Logger{ // methods implementation } public class DatabaseLogger implements Logger { private LoggerDAO loggerDAO; // DatabaseLogger depends on LoggerDAO public void setLoggerDAO(LoggerDAO loggerDAO) { this.loggerDAO = loggerDAO; } // methods implementation } Container c = new MentaContainer(); c.ioc(LoggerDAO.class, JdbcLoggerDAO.class); c.ioc(Logger.class, DatabaseLogger.class).addPropertyDependency(LoggerDAO.class); Logger logger = c.get(Logger.class); // Logger will come with its dependency LoggerDAO
You can also inject the components present in the container inside any object:
public class MyClass { private Logger logger; public void setLogger(Logger logger) { this.logger = logger; } // ... } MyClass myClass = new MyClass(); c.inject(myClass); // DatabaseLogger will be injected through setter