Dieser Artikel fasst hauptsächlich einige Rückrufmethoden und erweiterbare Punkte zusammen, die von Spring Container vor und nach der Initanzinitation bereitgestellt werden. Mit diesen Methoden und Erweiterungspunkten kann eine spezielle logische Verarbeitung vor und nach den Spring -Initialisierungsinstanzen durchgeführt werden.
Das Folgende wird hauptsächlich eingeführt:
Lebenszyklus-Initialisierungs-Rückrufmethode auf Klassenebene init-Method-Konfiguration, Initialisierungsschnittstelle und Postkonstrukte-Annotation
Erweiterung der Container-Ebene-Bohnenpostprozessor-Schnittstelle und BeanfactoryPostProcessor-Schnittstelle
1. Lebenszyklus-Rückruf auf Klassenebene
1.1init-Methode
Referenz: SpringbeanxSdinit-Methode
Init-Method ist ein Konfigurationselement, wenn eine Bean in der Federkonfigurationsdatei deklariert wird. Der Wert des Init-Method-Konfigurationselements ist eine parameterlose Methode in der Klasse, aber eine Ausnahme kann geworfen werden. Diese Methode wird aufgerufen, nachdem der Federcontainer das Objekt instanziiert und den Eigenschaftswert festlegt.
Die Funktionen, die von Init-Methode implementiert werden können
Federkonfigurationsdateien und Testklassen sind wie folgt:
<bean id = "initMethodbeanService" init-method = "init"> <Eigenschaft name = "f2" value = "2"/> </bean>
Die Testklasse lautet wie folgt:
public class initmethodbeansservice {private static Integer f1; init () {System.out.println ("InitMethodbeanservice Init -Methode ausführen ...");} public Integer getf2 () {return f2;} public void setf2 (Integer f2) {this.f2 = f2; system.out.println ("initger.Die Ausführungsergebnisse werden wie folgt gedruckt:
InitMethodbeanService statischer Block ausführen ... InitMethodbeansservice Construct -Methode Ausführen ... initMethodbeanService setf2 -Methode Ausführen ... initMethodbeansservice Init -Methode Ausführen ... Testmethode ausführen ...
1.2InitializingBean -Schnittstelle
Referenz: Frühling Offizielles Dokument Beans-faktorisch-lifecycle-initialisierungsbean
Eine initialisierungsbekische Schnittstelle deklariert eine Methode nach der Propertiesset, die nach dem Federcontainer das Objekt instanziiert und den Eigenschaftswert festlegt. Es steht im Einklang mit der oben implementierten Funktionalität, daher empfiehlt Spring nicht die Verwendung der Initialisierungs-Schnittstelle.
Das Beispiel ist relativ einfach, nicht aufgeführt
1.3Postconstruct Annotation
Übersetzung: Frühling Offizielles Dokument Beans-Postconstruct-and-Predestroy-Annotationen
@Postconstruct Annotation ist eine Rückrufmethode für Lebenszyklus, die mit der Implementierung der Init-Methoden- und Initialisierungs-Schnittstellen übereinstimmt.
@PostconstructPublic void postconstruct () {System.out.println ("Post -ConstructService Post -Construct -Methode ausführen ...");}Fassen Sie die oben genannten drei Lebenszyklus-Rückrufmethoden init-Method, initialisierungsbean, @Postconstruct Annotation zusammen
1. Alle sind so instanziiert und für einzelne Klassen post bearbeitet
2. Die Ausführungszeit wird nach der Unterrichts -Instanziierung aufgerufen und Mitgliedsvariablen werden injiziert.
3. Für Init-Method können Sie auch die Standardinitialisierungsmethode unter dem Beans-Element der Federkonfigurationsdatei konfigurieren, und das Konfigurationselement ist Standard-Init-Methode
V. Wenn die in den drei Methoden konfigurierten Methoden gleich sind, wird die Methode nur einmal ausgeführt (siehe: Spring Official Dokument Beans-Factory-Lifecycle-Comby-Effect))
5. Es gibt eine erste Rückrufmethode, und es gibt auch eine zerstörte Rückrufmethode. @Postconstruct Annotation-Methode> Initialisierungsbean von NachpropertieSet> Init-Method-Methoden entsprechen der @Predestroy-Annotationsmethode> DisposableBean's Destroy> Destroy-Method-Methode
2. Erweiterung der Containerebene
Übersetzung: Frühling Offizielles Dokument 3.8ContaineExtensionPoints
Im Allgemeinen müssen Entwickler eine Unterklasse von ApplicationContext nicht an die Erweiterung von Springioc -Containern anpassen. Springioc -Behälter können die Verlängerung der Springioc -Behälter über einige freiliegende Schnittstellen erreichen.
2.1BeanPostProcessor -Schnittstelle
2.1.
Die BeanPostProcessor-Schnittstelle definiert zwei Rückrufmethoden auf Containerebene postProcessBeforeinitialisierung und Postprozessafterinitialisierung, die für eine logische Verarbeitung nach der Initanzierung der Instanz verwendet werden und für alle Instanzen im Container verarbeitet werden. Die Klasse, die die BeanPostProcessor -Schnittstelle implementiert, wird als Bean -Instance -Initialisierungspostprozessor bezeichnet.
Wenn Postprozessoren für mehrere Instanzinitialisierung in Springioc -Container integriert werden, wird der Satz dieser Postprozessoren als Bean -Instance -Initanzen -Postprozessorkette bezeichnet.
Die Postprozessbefor -Einstellungsmethode wird ausgeführt, nachdem die Instanziation der Klasse und die Mitgliedervariablen -Injektion und vor der Initialisierungsmethode (z.
Die Postprozessafteritialisierungsmethode wird nach Abschluss der Klasseninstanziation und der variablen Injektion des Unterrichts ausgeführt, und die Initialisierungsmethode (z.
Zusammenfassen:
1. Die Instanzinitialisierung Post-Prozessor wird hauptsächlich für einige Proxy-Operationen auf der Instanz verwendet. Einige Funktionen, die AOP im Frühjahr verwenden, werden auch über Post-Prozessoren implementiert.
2. Die Post-Prozessor-Kette für Instanzinitialisierung besteht aus mehreren Post-Prozessoren, und es wird Probleme mit der Ausführungsauftrag geben. Sie können die geordnete Schnittstelle implementieren, um die Ausführungsreihenfolge der Nachbearbeitung anzugeben. Die geordnete Schnittstelle deklariert die GetOrder -Methode. Je kleiner der Rückgabewert der Methode ist, desto höher ist die Priorität der Nachbearbeitung und die frühere Ausführung.
3. Bei der Initialisierung des Postprozessors durch Implementierung der BeanPostProcessor -Schnittstelle wird empfohlen, die geordnete Schnittstelle zu implementieren und Priorität anzugeben.
V. Für Springioc -Behälter mit hierarchischen Strukturen wirkt die Prozessorkette nach der Initanzierung nicht auf die von andere Container initialisierte Instanz, auch wenn sich die beiden Container in derselben Hierarchie befinden.
5. Die Implementierungsklasse der Instanzinitialisierung Post-Prozessor muss nur wie die gewöhnlichen, fundierten Bohnen deklariert werden. Der Springioc-Container erkennt ihn automatisch und fügt es der Post-Prozessor-Kette für Instanzinitialisierung hinzu.
6. Im Vergleich zur automatischen Erkennung können wir auch die addBeanPostProcessor -Methode für konfigurierbaresBeAnfactory aufrufen, um der Postprozessor -Kette der Instanzinitialisierung programmgesteuert eine Instanzinitialisierungspostprozessor hinzuzufügen. Dies ist praktischer in Szenarien, in denen das Hinzufügen von Bedingungen bestimmt werden muss. Dieser Programmieransatz ignoriert die von der implementierte geordneten Schnittstelle angegebene Reihenfolge, wirkt jedoch auf alle Instanzen, die vor der Initialisierung des Postprozessors automatisch erkannt werden.
2.1.2 Bean -Instanzinitialisierung Postprozessor und AOP
BeanPostProcessor ist eine spezielle Schnittstelle, und die Klasse, die diese Schnittstelle implementiert, wird als Postprozessor für Fälle von Federbohnen verwendet. Daher werden in einer speziellen Phase des Frühlingsanwendungskontext -Startups alle Instanzen, die die BeanPostProcessor -Schnittstelle implementieren, direkt initialisiert, und die von der Instanz verwiesenen Klassen werden ebenfalls instanziiert. Dann als Postprozessor für andere normale Instanzen angewendet.
Da der automatische Proxy von AOP in Form von Postprozessoren implementiert wird, kann weder die Bean -Instanz die Postprozessor -Ketteninstanz oder ihre referenzierte Instanz automatisch initialisiert werden. Weben Sie daher bei diesen Beispielen nicht ins Gesicht. (In diesen Fällen wird eine Protokollnachricht generiert: "Klasse Foo kann nicht von allen instanziierten Postprozessorketten verarbeitet werden, d. H. Kann nicht automatisch vervollständigt werden").
HINWEIS: Wenn sich der Postprozessor der Instanziierung auf andere Bohnen in Form von Autowirkung oder @Resource bezieht, kann der Federcontainer nicht spezifizierte Bohnen injizieren, wenn sie mit Typ-Matching-Abhängigkeit injiziert wird (z. B. der Instantiationspostprozessor-Implementierungsklasse abhängt ab. Die Injektion wird in Form der Typ-Matching injiziert, und zu diesem Zeitpunkt kann eine nicht spezifizierte Bohne injiziert werden. Dies kann auch dazu führen, dass automatische Proxying- oder andere Methoden zur Verarbeitung der Instanziierung nach der Verarbeitung fehlschlägt.
2.1.3 BEAN -Instanzinitialisierung Postprozessor Beispiel
öffentliche Klasse BeanPostProcessorService implementiert BeanPostProcessor {@Override öffentliches Objekt Postprozessafterinitialisierung (Objekt O, String S) wirft Beansexception {System.out.println ("BeanPostProcessorservice postprocessafterinitialization method execute ..."). s) löst beansexception {System.out.println ("BeanPostProcessorService postProcessBeforeInitialization Methode aus ...");2.2BeanFactoryPostProcessor -Schnittstelle
2.2.1 Beanfaktorische Postprozessor
Durch die Implementierung der BeanfactoryPostProcessor -Schnittstelle können Sie die vom Container verwalteten Konfigurationsmetadaten von Beans lesen und Änderungen vor der Instanziierung der Bean vornehmen. Diese Bohnen werden beanfaktorische Postprozessoren genannt.
Ähnlichkeiten und Unterschiede zwischen BeanfactoryPostprozessoren und BeanpostProcessor -Schnittstellen:
Ähnlichkeiten:
Alle sind Postprozessoren auf Containerebene
Alle können mit mehreren Postprozessoren konfiguriert werden, und die Ausführungsreihenfolge wird durch die Implementierung der geordneten Schnittstelle angegeben.
Sie werden für Bohnen verarbeitet, die in von Schnittstellen deklarierten Behältern verwaltet werden. In Behältern mit hierarchischen Strukturen können Bohnen in anderen Behältern nicht verarbeitet werden, selbst wenn sich die beiden Behälter auf derselben Ebene befinden.
Alle müssen nur im Behälter wie gewöhnliche Bohnen deklariert werden. Der Container erkennt automatisch als Postprozessor.
Die Konfiguration der Dely -Initialisierungseigenschaft wird ignoriert
Unterschiede:
Die BeanfactoryPostProcessors -Schnittstelle verarbeitet die Konfigurationsmetadaten der Bohne vor der Instanziierung von Bohnen, und die Beanpostprozessor -Schnittstelle verarbeitet die Instanz der Bohne nach der Instanziierung von Bohnen **
Die BeanfactoryPostProcessors -Schnittstelle kann auch eine Instanz einer Bean über die Beanfactory.getbean () -Methode erhalten, die dazu führt, dass die Bean instanziiert. Da der Postprozessor der BeanfactoryPostProcessoren vor dem Instanziieren aller Beans ausgeführt wird, wird die Beanfaktor -Methode die Bohnen im Voraus instanziiert, wodurch der Lebenszyklus des Containerstandards, was einige negative Auswirkungen verursachen kann (z. B. die im Voraus instanziierte Bean instanziiert, die Verarbeitung der Bezahlung des Beschlags für Bohnen ignoriert.
2.2.2 Frühling eingebaute und benutzerdefinierte beanfaktorische Postprozessor
Spring hat eingebaute Beanfaktor-Postprozessoren (z. B.: PropertyPlaceHolfersConfiger und PropertyOverrideConfiger). Es unterstützt auch die Implementierung der BeanfactoryPostProcessor -Schnittstelle und passt den Beanfactory -Postprozessor an. Sprechen wir über die integrierten Postprozessoren und benutzerdefinierten Postprozessoren von Spring.
PropertyPlacePlaceConFigurer
Um die durch Änderungen der Haupt -XML -Definitionsdatei verursachten Risiken zu vermeiden, bietet Spring Konfigurationstrennung und kann einige Variablen konfigurieren, die möglicherweise in die Eigenschaftskonfigurationsdatei geändert werden und sie in der XML -Definitionsdatei als Platzhalter verweisen. Auf diese Weise müssen die Konfiguration nur geändert werden, um die Attributkonfigurationsdatei zu ändern. PropertyPlacePlaTeholderConFigurer wird verwendet, um Platzhalter zu erkennen und Platzhalter durch Konfigurationseigenschaftswerte zu ersetzen. Beispiele sind wie folgt:
PropertyPlaPleholderConFigurer verwendet die Eigenschaftskonfigurationsdatei von JDBC.Properties, um den Immobilien-Platzhalter für Datenbank-bezogene Informationen in der DataSource-Bean durch den entsprechenden Konfigurationswert zur Laufzeit zu ersetzen.
Die XML -Konfiguration lautet wie folgt:
<bean> <Property name = "Standorte" value = "classPath: com/foo/jdbc.properties"/> </bean> <bean id = "dataSource" Destroy-method = "close"> <Property name = "driverClassName" value = "$ {jdbc.driverClassname}"/< value = "$ {jdbc.url}"/> <Eigenschaft name = "userername" value = "$ {jdbc.username}"/> <Eigenschaft name = "Passwort" value = "$ {jdbc.password}"/>Die Attributkonfigurationsdatei jdbc.properties lautet wie folgt:
jdbc.driverClassName = org.hsqldb.jdbcdriverjdbc.url = jdbc: hsqldb: hsql: // produktion: 9002jdbc.username = sajdbc.password = root
PropertyPlaPleholderConFigurer unterstützt nicht nur das Lesen von Eigenschaftskonfigurationsdateien, sondern auch das Lesen von Systemeigenschaften. Priorität lesen kann über den Eigenschaftswert SystemPropertiesMode konfiguriert werden. Die verschiedenen Werte werden wie folgt beschrieben:
0: Lesen Sie keine Systemeigenschaften
1: Wenn die Konfiguration für den entsprechenden Platzhalter nicht in der Referenzattributkonfigurationsdatei abgerufen wird, wird das Systemattribut gelesen. Standard ist 1
2: Lesen Sie zuerst die Systemattribute und lesen Sie dann die Referenzattributkonfigurationsdatei. Diese Konfiguration kann dazu führen, dass Systemeigenschaften die Konfigurationsdatei überschreiben.
PropertyOverrideConfiger
Die PropertyOverrideConFigurer -Klasse kann den Beans im Container die Werte direkt zuweisen, indem sie sich auf die Eigenschaftskonfigurationsdatei bezieht. Wenn die Eigenschaft einer Bean von mehreren Instanzen der PropertyOverrideConfiger -Klasse zugewiesen wird, überschreibt der letzte Wert den vorherigen.
Zuweisen der oben genannten DataSource -Bean als Beispiel:
Die PropertyOverRideConFigurer -Klasse verwendet eine neue Möglichkeit, die Eigenschaftskonfigurationsdatei zu verweisen, wie folgt:
<Kontext: Property-Override location = "classPath: override.properties"/>
Die Namensregeln für Eigenschaften von Override.Properties -Eigenschaftskonfigurationsdatei unterscheiden
dataSource.driverClassName = com.mysql.jdbc.driverdatasource.url = jdbc: mySQL: mydbdataSource.username = sadataSource.password = root
Unterstützt die Zuordnung von zusammengesetzten Attributen, stellt jedoch sicher, dass das Objekt, das auf das zugewiesene Attribut verweist, nicht leer ist, z. B. foo.fred.bob.sammy = 123
Custom Bean Factory Postprozessor
Der benutzerdefinierte Bean Factory Postprozessor implementiert die BeanfactoryPostProcessor -Schnittstelle, um die Änderung der Konfigurationsmetadaten der von Spring Container verwalteten Bean zu vervollständigen. Beispiel: Ändern Sie den von den Klassenattributen injizierten Wert, das Beispiel lautet wie folgt:
Definieren Sie eine Benutzerbekleidung der Benutzerklasse
public class UserBean {private String -Benutzername; public String getUnername () {return userername;} public void setUnername (String -Benutzername) {this.username = userername;}}Konfiguration der Benutzerklasse der Spring XML XML -Konfiguration und injiziert den Wert HAHA in den Benutzernamen -Attribut -Benutzername
<bean/> <bean id = "user"> <Eigenschaft name = "userername" value = "haha"/> </bean>
Im Folgenden finden Sie einen benutzerdefinierten Bean Factory -Postprozessor. Ändern Sie den Wert des Eigentums Benutzernamen an Heihei
öffentliche Klasse BeanfactoryPostProcessorService implementiert BeanfactoryPostProcessor (@Override public void postProcessbeanfactory (configurablelistableBeAnfactory beanfactory) beansexception {system.outRintln ("BeanfactoryPostPostPostPostPostPostPostPostPostPostPostPostPostPostPostPostPostProcessors. BeanDefinition bd = beanfactory.getBeANDefinition ("Benutzer"); MutablePropertyValues pv = bd.getPropertyValues (); if (pv.contains ("userername") {pv.addpropertyValue ("Benutzername", "Heihei"); }}}Zusammenfassen
Das obige ist die detaillierte Erklärung für Rückrufe und Containerverlängerungen in diesem Artikel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Eine kurze Diskussion über die Anwendung von benutzerdefinierten Anmerkungen im Frühjahr
Die IOC -Codeanalyse von Spring
SpringMVC Interceptor HandlerInterceptor -Verwendungscode Beispiel
Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!