2017-04-10 4 views
1

Ich benutze Spring Boot. Ich habe eine Frage bezüglich des Singleton-Verhaltens von Spring-Boot-Bohnen. Ich benutze Bohnen, die Singleton sind. Sie haben also nur eine Instanz pro Anwendung.Spring Boot Klassenverhalten

Aber bezweifle ich habe, ist, dass

a) Anwendung nur 1 Instanz für jede Anforderung erstellen wird oder die Anwendung wird nur 1 Instanz für alle Anfragen erstellen?

b) Ich habe einen Service & eine statische Variable in ihm erstellen. Was nun passiert ist, dass ich in einer Anfrage den Wert & in einer anderen Anfrage ändere, wenn ich die Variable bekomme, bekomme ich die geänderten Werte? Warum das?

c) Gibt es auch dasselbe Verhalten, wenn die Variable nicht statisch ist, nur normale Klassenvariable? Warum das?

d) Was wäre auch der gute Weg, die Daten zu speichern, die anforderungsspezifisch sind, z.B. Lassen Sie uns sagen, dass ich in jeder Anfrage die Transaktions-ID & erstelle, die ich an 10 verschiedenen Stellen in der Anfrage verwenden möchte. Also wie speichere ich es pro Anfrage oder muss ich es überall hin übergeben. Überlegen Sie, ich habe 1000 Anfragen pro Sekunde. Natürlich kann ich keine Variablen auf Klassenebene setzen, sonst werden die Werte jedes Mal überschrieben, wenn die Beans nicht threadsicher sind.

Antwort

1

Einige Gedanken.
In Bezug auf das Singleton Verhalten von Spring Boot Bohnen -> Singleton Verhalten ist aus dem Frühjahr, nicht genau mit Springboot als solche verwandt.

a) Anwendung erstellt nur 1 Instanz für jede Anfrage ODER Anwendung erstellt nur 1 Instanz für alle Anfragen? --->Anwendung erstellt nur einmal Instanz dieser Klasse in der gesamten Anwendung, sofern nicht anders angegeben mit @Scope.

b) Ich habe einen Service & eine statische Variable in ihm erstellt. Was nun passiert ist, dass ich in einer Anfrage den Wert & in einer anderen Anfrage ändere, wenn ich die Variable bekomme, bekomme ich die geänderten Werte? Warum das? --->Wie Sie aus meiner vorherigen Antwort verstehen, wird es nur eine Instanz der Klasse geben, und statische Variable wird von Natur aus über mehrere Aufrufe verteilt. Daher sehen Sie den gleichen Wert.

c) Auch dasselbe Verhalten existiert, wenn die Variable nicht statisch ist, nur normale Klassenvariable? Warum das? --->Seit seiner derselben Instanz, die jedes Mal an Sie zurückgegeben wird, wenn Sie für eine Bean (durch @Autowired oder andere Weise) anfordern, erhalten Sie den gleichen Wert für die Variable

d) auch was wäre die gute Möglichkeit, die Daten zu speichern, die anforderungsspezifisch sind, z Lassen Sie uns sagen, dass ich in jeder Anfrage die Transaktions-ID & erstelle, die ich an 10 verschiedenen Stellen in der Anfrage verwenden möchte. Also wie speichere ich es pro Anfrage oder muss ich es überall hin übergeben. Überlegen Sie, ich habe 1000 Anfragen pro Sekunde. Natürlich kann ich keine Variablen auf Klassenebene setzen, sonst werden die Werte jedes Mal überschrieben, wenn die Beans nicht threadsicher sind. --->Einer der größten Designaspekte im Frühjahrsprojekt besteht darin, herauszufinden, welche Teile pro Anfrage verwendet werden und welche geteilt werden können. Es wird schwer sein zu kommentieren, ohne mehr Details zu erfahren. Aber nur von Ihrer Beschreibung her würde ich vorschlagen, diese Klasse nicht zu einer Bean zu machen und jedes Mal eine Instanz davon zu erstellen. Wie auch immer, die Lebensdauer dieser Objekte ist kurz (pro Anfrage) und wird Müll gesammelt werden. Oder denken Sie Anfrage scopr für diese Bohne mit @Scope(value="request")

Hoffnung, es hilft

1

Singleton-Klassen haben einzelne Instanzen, die in der gesamten Anwendung verwendet werden.

a) Die Anwendung erstellt nur eine Instanz, die bei allen Anfragen in der gesamten Anwendung verwendet wird.

b) Statische Variablen sind Variablen auf Klassenebene. Wenn sich der Wert in einer Anfrage ändert, wird er automatisch in allen anderen Anfragen berücksichtigt.

Dasselbe gilt für alle anderen Variablen auf Klassenebene.

c) wie b)

d) Wenn Sie Benutzer können einige Daten im gesamten Anfrage dann tun Sie es, indem sie als Sitzung den Umfang der Klasse definieren. Auf diese Weise können Sie die Datenanforderung spezifisch halten.

+0

Gibt es einen Nachteil der Verwendung von Scope of Beans als Session? –

+0

@AnkitBansal Ich bin mir nicht ganz sicher, aber was ich aus Ihrer Frage verstehe, ist, dass Sie zu viele Anrufe gleichzeitig machen wollen, und wenn Sie in jeder Sitzung riesige Datenmengen speichern, könnte dies der Fall sein, den Sie möchten zu betrachten –

+0

Nicht große Menge an Daten, aber ja einige Daten.? Zu viele Aufrufe bedeuten, dass ich APIs entwickle, die in einer Website verwendet werden, die zu jeder Zeit mehr als 1000 Benutzer hat. –