Ich versuche derzeit, Injektion in einer Java-Konsole-Anwendung mit Guice implementieren. Die Anwendung importiert XML-Dateien in eine Datenbank. Jeder Importvorgang wird in einem AbstractImporter
getan, was entweder ein UserImporter
sein kann, ein ScheduleImporter
usw.Guice benutzerdefinierten Bereich Eingabe und Beenden in der Java-Konsole Anwendung
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...
}
Ich habe erfolgreich meine eigenen Rahmen geschaffen (@ImporterScoped
) für Klassen, die nur verfügbar sein sollten und instanziiert nur in einem Importer
. Der Bereich wurde erstellt, indem die Schritte in the wiki ausgeführt wurden. Mein Problem ist, wie sollte ich den Bereich in ScheduleMigrator
eingeben und verlassen? Wie Sie in ScheduleMigrator
sehen können, wird jede Importer
injiziert und ihre run()
Methode aufgerufen. Es gibt auch Fabriken (basierend auf Guices @AssistedInject
Funktion). Dies ist, wo ich möchte, dass jeder Bereich zu starten und zu beenden, sollten UserImporter
und ScheduleImporterFactory
in ihrem eigenen Bereich ausgeführt werden.
Dies ist eine grobe Vorstellung davon, was ich zu erreichen bin versucht:
importerScope.enter();
(new UserImporter()).run();
importerScope.exit();
Guice in der Dokumentation erwähnt die Verwendung von Abfangjäger, aber ich bin ein wenig verloren, wie kann es umgesetzt werden.
Welche Scope-Implementierung verwenden Sie? Welcher Code löst einen Importeur aus? Was ist der Lebenszyklus eines Importeursobjekts? Guide AOP ist ein möglicher Weg, um dieses Problem zu lösen, aber ich denke, dass es in diesem Fall wahrscheinlich nicht notwendig ist. –
Nicht sicher, ob ich richtig verstanden habe ... Ich benutze einen benutzerdefinierten Bereich implementiert durch Befolgen der Wiki-Leitfaden für benutzerdefinierte Bereiche. Ich habe meine ursprüngliche Frage aktualisiert, um Informationen darüber einzubeziehen, wie Importeure instanziiert und ausgeführt werden, hoffe, dass dies hilft! – giannoug