Вы должны просто связать FileHandler
и все его зависимости с областью по умолчанию (т.е. без области). Затем введите Provider<FileHandler>
и используйте его get()
каждый раз, когда вам нужен новый экземпляр FileHandler
. Поскольку FileHandler
не имеет области действия, каждый раз, когда get()
вызывается, необходимо создавать новый экземпляр FileHandler
... и поскольку его зависимости также не имеют области действия, каждый из них должен создавать новый экземпляр каждого из них. время тоже. Он должен работать так, как вы хотите.
Я думаю, что вам (возможно) здесь не хватает того, что вам не нужно писать ни одного из этих провайдеров самостоятельно ... просто введите Provider<FileHandler>
и Guice сделает все за вас.
Редактировать: Вот небольшой класс, который я написал, который демонстрирует зависимости класса, создаваемого новым каждый раз, когда создается экземпляр этого класса.
public class Test {
public static void main(String[] args) {
Injector injector = Guice.createInjector();
injector.getInstance(Test.class);
}
@Inject public Test(Provider<FileHandler> fileHandlerProvider) {
FileHandler fileHandler1 = fileHandlerProvider.get();
FileHandler fileHandler2 = fileHandlerProvider.get();
System.out.println("fileHandler1 == fileHandler2? " +
(fileHandler1 == fileHandler2));
System.out.println("fileHandler1.parser == fileHandler2.parser? " +
(fileHandler1.parser == fileHandler2.parser));
System.out.println("fileHandler1.print == fileHandler2.printer? " +
(fileHandler1.printer == fileHandler2.printer));
}
private static class FileHandler {
private final Parser parser;
private final OutputPrinter printer;
@Inject private FileHandler(Parser parser, OutputPrinter printer) {
this.parser = parser;
this.printer = printer;
}
}
private static class Parser {
}
private static class OutputPrinter {
}
}
При запуске этот код печатает:
fileHandler1 == fileHandler2? false
fileHandler1.parser == fileHandler2.parser? false
fileHandler1.print == fileHandler2.printer? false
Это показывает, что не только новый экземпляр FileHandler
создавался каждый раз, новые экземпляры Parser
и OutputPrinter
создавались и также вводились в FileHandler
каждый раз.