You should just bind FileHandlerall its dependencies with the default value (i.e. without scope). Then enter Provider<FileHandler>and use it get()every time you need a new instance FileHandler. Since it FileHandlerdoes not have a scope, each time it get()is called, a new instance is created FileHandler... and since its dependencies also do not have a scope, each instance of each of them must be created every time. It should work the way you want.
I think the thing you're (possibly) missing here is that you don't need to write any of these providers yourself ... just type Provider<FileHandler>in and Guice will do it all for you.
: , , .
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 .