Я думаю, что вы, возможно, слишком усложняете проблему.
Похоже, что SecondProcedure имеет простую зависимость от Table:
class SecondProcedure {
@Inject
SecondProcedure(Table table) {
this.table = table;
}
}
И FirstProcedure является провайдером таблицы:
class FirstProcedure implements Provider<Table> {
public Table get() {
return buildTheTable();
}
}
Тогда вашему модулю просто нужно связать провайдера:
class SomeModule extends AbstractModule {
protected void configure() {
bind(Table.class).toProvider(FirstProcedure.class);
}
}
Привязка JIT аннотированного конструктора @Inject обеспечит SecondProcedure, поэтому вам не нужно связывать его явно.
Как только вы это сделаете, вы можете подумать об изменении имени FirstProcedure на TableProvider.
Чтобы использовать FirstProcedure, вы просто вводите его или получаете из инжектора:
injector.getInstance(FirstProcedure.class).run();
Кроме того, синглтон-шаблон Гисе (область действия @Singleton) не является анти-паттерном, поскольку он ограничен инжектором.Существует множество случаев, когда это уместно, и одноэлементная реализация Guice не мешает тестированию.
Возможно, вас должно беспокоить статическое состояние.Сам Guice дает хорошее объяснение того, почему это плохо: http://code.google.com/p/google-guice/wiki/AvoidStaticState