В настоящее время я пытаюсь внедрить инъекцию в консольное приложение Java с помощью Guice. Приложение импортирует XML-файлы в базу данных. Каждая операция импорта выполняется в AbstractImporter
, который может быть либо UserImporter
, ScheduleImporter
и т.д.Вход и выход Guice custom scope в приложении консоли Java
public class ScheduleMigrator extends AbstractMigrator {
private final UserImporter userImporter;
private final ScheduleImporterFactory scheduleImporterFactory;
@Inject
public ScheduleMigrator(UserImporter userImporter,
ScheduleImporterFactory scheduleImporterFactory) {
this.userImporter = userImporter;
this.scheduleImporterFactory = scheduleImporterFactory;
}
public void migrate() {
// Migrate users
userImporter.run();
// Migrate schedules for each type
for (ScheduleType scheduleTypes : ScheduleType.values()) {
ScheduleImporter importer =
scheduleImporterFactory.create(scheduleTypes);
importer.run();
}
}
}
public class UserImporter extends AbstractImporter {
private final UserTransformer userTransformer;
private final ConfigurationService configurationService;
@Inject
public UserImporter(UserTransformer userTransformer,
ConfigurationService configurationService) {
this.userTransformer = userTransformer;
this.configurationService = configurationService;
}
public void run() {
// do stuff here
}
}
@Singleton
public class UserTransformer {
// ...code ommited...
}
@ImporterScoped
public class ConfigurationService {
// ...code ommited...
}
Я успешно создал свой собственный объем (@ImporterScoped
) для классов, которые должны быть доступны только и экземпляры только в Importer
. Область была создана, выполнив следующие шаги: the wiki. Моя проблема в том, как мне войти и выйти из области в ScheduleMigrator
?
Как вы можете видеть в ScheduleMigrator
, вводится каждый Importer
и вызывается его метод run()
. Существуют также фабрики (основанные на функции Guice's @AssistedInject
). Здесь я хочу, чтобы каждая область начала и конца, UserImporter
и ScheduleImporterFactory
должны работать в своем собственном объеме.
Это приблизительное представление о том, что я пытаюсь достичь:
importerScope.enter();
(new UserImporter()).run();
importerScope.exit();
документация Guice упоминает использование перехватчиков, но я немного потерял о том, как он может быть реализован.
Какая реализация области применения вы используете? Какой код запускает импортер? Каков жизненный цикл объекта импортера? Руководство АОП является одним из возможных способов решения этой проблемы, но я думаю, что в этом случае, вероятно, это не обязательно. –
Не уверен, правильно ли я понял ... Я использую настраиваемую область, реализованную, следуя руководству по вики на пользовательских областях. Я обновил свой первоначальный вопрос, чтобы включить информацию о том, как «Импортер получает экземпляр и запускается, надеюсь, что это поможет! – giannoug