Wie zu Produzieren, Prototyp-Objekten von singleton? (Design-Hilfe benötigt)
Ich bin relativ neu auf Frühling und ich habe mich eingegraben in ein Loch. Ich bin versucht zu Modell motor cars. Jedes Modell hat eine eigene builder-Objekt, und ich habe eine BuilderFactory, dass gibt den richtigen generator, basierend auf der Auswahl des Benutzers aus einer web-app.
So, ich bin auf der Suche nach Anregungen auf, wie man diesen Ansatz problem wo muss ich erstellen Sie eine Reihe von einzelnen Fahrzeugen, aber ich weiß nicht, was für ein Fahrzeug brauche ich noch, bis der run-time, und jedes Fahrzeug muss eindeutig sein, um den Benutzer.
Was ich habe, im moment ist unten dargestellt. Ich habe das problem im moment ist, dass, weil die einzelnen Bauherren sind singletons, so sind die einzelnen Fahrzeuge. Ich brauche Sie
zu Prototypen. Ich weiß, es sieht alles ziemlich schrecklich, so dass ich bin sicher, es muss einen besseren Weg, dies zu tun.
Der obersten Ebene aus der web-app aussieht;
Vehicle vehicle = vehicleBuilderFactory.getBuilder(platform).build();
Meine vehicleBuilderFactory sieht wie folgt aus;
@Service
public class VehicleBuilderFactory {
@Autowired
Discovery3Builder discovery3Builder;
@Autowired
Discovery4Builder discovery4Builder;
//Lots of @Autowired statements here.
@Autowired
FreeLander2010Builder freeLander2010Builder;
public VehicleBuilder getBuilder(Platform platform) {
switch (platform.getId()) {
case 1: return discovery3Builder;
case 2: return discovery4Builder;
//Lots of case statements here
case 44: return freeLander2010Builder;
default: return null;
}
}
}
welche selbst sieht ziemlich schrecklich. Jeder einzelne generator aussieht;
@Service
public class DefenderBuilder implements VehicleBuilder {
@Autowired
Defender defender;
//Loads of Defender specific setters ommitted
@Override
public Vehicle build() {
return defender;
}
}
und schließlich die einzelnen Fahrzeug
@Service
@Scope("prototype")
public class Defender extends Vehicle {
}
Das Hauptproblem nun ist, dass, weil die Bauherren sind singletons, so sind die Fahrzeuge, und
Ich brauche Sie, um Prototypen, da dem Benutzer Ein Defender ist anders an Benutzer B den Defender.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Spring ObjectFactory haben es bis Prototyp-scoped beans aus einer singleton-scoped bean. Die Verwendung ist ziemlich einfach:
Diese gibt einen neuen Defender bei jedem Aufruf defenderFactory.getObject()
Lesen, ohne zu sehr in den Details, die Sie sagen, Sie wollen produzieren, Prototyp Bohnen aus einem singleton-möglicherweise mit einem Blick in den IoC-container.
Abschnitt 3.4.6.1 Lookup-Methode der Injektion der Frühling Dokumentation beschreibt, wie dies geschehen kann, ohne die Inversion of Control, D. H. ohne Ihre Bohnen zu wissen, über die bean store.
Habe ich Gebrauch gemacht, die ServiceLocatorFactoryBean zu lösen, die ein ähnliches problem vor. Die Klasse Javadoc ist hervorragend und enthält einige klare Beispiele.
Zwei Dinge:
1) Sie können proxy verwenden, um zu halten schmaler Bereich aus dem breiteren Bereich(e.g Prototyp singleton)
Alles, was Sie brauchen, ist zu definieren, der Prototyp-Komponente mit den jeweiligen Anwendungsbereich und proxyMode
Sie können Lesen Sie über die scoped-proxy hier.
2) eine Andere Sache, die ich bemerkt habe, ist, dass Sie planen, verwenden Sie mehrere autowired annotation.
beachten Sie, dass Sie verwenden können, autowire auf eine Liste von interface und es wird autowire alle Komponenten, die diese Schnittstelle implementiert, wie besprochen,hier.
Außerdem können Sie eine Plattform-id, die VehicleBuilder-Schnittstelle und generiert dann eine Karte in den Konstruktor.e.g:
auf diese Weise können Sie vermeiden, die switch case.