Самозагрузочный инжектор Guice
У меня есть сценарий, в котором мне понадобятся некоторые объекты, вводимые с самого начала, такие как регистрация, но затем другие объекты вводятся по требованию. Что я не знаю, если в моем консольном приложении, я просто позвоню
Guice.createInjector(....)
в моей функции Main, а затем, когда мне нужен другой объект, тип, который мне нужен по требованию, я использую провайдер для инъекции этого же объекта снова? Мне трудно понять, как лучше всего использовать инжектор Guice для этого сценария. Заранее спасибо.
1 ответ
В общем, да: залить Provider
чтобы получить ваши объекты позже, и не держите ваш инжектор напрямую дольше, чем это необходимо.
В идеале ваш загрузчик должен быть именно таким: он должен создавать экземпляр вашего инжектора и получать какой-то экземпляр всего приложения. Это особенно важно, потому что Guice полезен для тестирования, поэтому хорошей идеей является максимизация части приложения, подчиняющейся Guice.
public class YourApplication {
public static void main(String[] args) {
// Only three lines exist outside the object graph.
Injector injector = Guice.createInjector(new YourModule1(), new YourModule2());
YourApplication app = injector.getInstance(YourApplication.class);
app.run();
}
@Inject Provider<YourDep1> depProvider1;
@Inject YourDep2 dep2;
public void run() {
// Here you have access to every @Inject field.
}
}
Здесь имейте в виду, что созданный вами инжектор хранится только в стеке. Это потому, что вы получаете все, что вам нужно от @Inject
поля, методы и конструкторы, включая сам Инжектор. Как вы предложили, вы можете использовать Provider
чтобы получить столько экземпляров, сколько вам нужно, включая ноль экземпляров, если объект не нужен в этом пути кода.