[Java] Spring DI ④ - Lebenszyklusverwaltung
Was ist DI-Lebenszyklusmanagement?
- Mit DI können Sie den Umfang einer Instanz festlegen
- Der Bereich wird mit der Annotation @Scope festgelegt
- Standardmäßig ist es Singleton und es kann nur eine Instanz erstellt werden.
- Beachten Sie, ob das Feld Instanzen mit unterschiedlichen Bereichen enthält
Was ist Lebenszyklusmanagement?
- Verwalten der Instanzerstellung (neu) und Zerstörung
- Um die neu erstellte Instanz zu zerstören, geben Sie null in die Variable ein, um den Speicher freizugeben
- Jedoch! ** Felder mit @Autowired werden von Spring automatisch behandelt, ohne null zu sein! ** **.
- Außerdem registriert Spring bei Verwendung des Servlets ** auch den Umfang der Instanz! ** (Servlet ist eine Funktion zum Registrieren einer Instanz im Sitzungsbereich oder im Anforderungsbereich.)
- Hinweis: Stellen Sie sicher, dass Sie wissen, wann die Instanz zerstört wird
Was ist ein Umfang
- Ablaufdatum der Instanz
- Beispiel: In der if-Anweisung als lokale Java-Variablen deklarierte Variablen können nicht außerhalb der if-Anweisung verwendet werden, da sich der Bereich innerhalb der if-Anweisung befindet.
- Sitzungsumfang
- Ablaufdatum von der Benutzeranmeldung bis zur Abmeldung
- Umfang anfordern
- Eine HTTP-Anforderung läuft ab
- Beispiel: Bereich des Anforderungsbereichs vom Benutzerregistrierungsbildschirm bis zum Registrierungsergebnisbildschirm
Verwendung von Scope
- Geben Sie an, welcher Bereich in der Anmerkung mit der Anmerkung @Scope registriert werden soll (siehe unten).
- Zusätzlich zu @Component kann die @ Scope-Annotation für @Bean, @Controller usw. verwendet werden.
- ** Einfach zu erstellen und Instanzen zu zerstören **
@Component
@Scope("prototype")
public class SampleComponent{
}
Von @Scope angegebener Bereich
- singleton
- Standardkonfiguration
- Erstellen Sie nur eine Instanz, wenn der Frühling beginnt.
- Teilen und verwenden Sie eine Instanz nach der Erstellung
- prototype
- Jedes Mal, wenn Sie eine Bean erhalten, wird eine Instanz erstellt
- session
- Für jede HTTP-Sitzung wird eine Instanz erstellt. Wird nur für Webanwendungen verwendet
- request
- Für jede HTTP-Anforderung wird eine Instanz erstellt. Wird nur für Webanwendungen verwendet
- globalSession
- Wird für jede Grobal-Sitzung in der Portlet-Umgebung generiert
- Wird nur für Webanwendungen verwendet, die Portlets unterstützen
- application
- Für jeden Kontext des Servlets wird eine Instanz erstellt. Nur für Webanwendungen verfügbar.
Hinweis 1: Der Standardwert ist Singleton
- Ohne @Scope wird die Instanz mit Singleton erstellt
- Mit Singleton kann nur eine Instanz des Objekts erstellt werden, und es ist nicht möglich, mehr als eine Instanz zu erstellen.
-
- Singleton ist normalerweise ausreichend für den Bereich von @Controller, @Service, @Repository
Hinweis 2: Wenn das Feld Instanzen mit unterschiedlichen Bereichen enthält
- Wenn eine Instanz des Singleton-Bereichs ein Objekt des Prototyp-Bereichs hat, ** wird Bean mit Prototyp-Bereich (im Folgenden als PrototypeComponent bezeichnet) zum Singleton-Bereich **
//Wird zum Singleton-Bereich
@Component
@Scope("prototype")
public class PrototypeComponent{
}
@Component
public class SingletonComponent{
@Autowired
private PrototypeComponent component;
}