Wenn wir Anwendungen basierend auf Spring entwickeln, platzieren wir normalerweise die Datenbankkonfiguration in der Eigenschaftendatei.
Zusammenfassung der Wissenspunkte, die an der Codeanalyse beteiligt sind:
1.NameSpaceHandler spricht den benutzerdefinierten Namespace in der XML -Konfigurationsdatei an
2.ContextNameSpaceHandler Kontextbezogener Parser definiert hier den spezifischen Parser für die Parsen des Eigentums am Platzierer
3.BeanDefinitionParser analysiert die Schnittstelle der Bean -Definition
4.BeanFactoryPostProcessor Nach dem Laden der Bean -Definition kann sie geändert werden.
5.PropertySourceSpaceHoldConFigurer behandelt Platzhalter in der Bean -Definition
Schauen wir uns zuerst die spezifische Verwendung an
Nutzung von Eigentum
Konfigurieren Sie die Eigenschaftendatei in der XML -Datei
<? xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.spingframework.org/schema/beans http://www.springframework.org/schema/beans/ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "> <Context: Property-Placeholder Lace =" ClassPath: FOO.Propties "/> </bours>
Auf diese Weise werden die Datei /src/main/resources/foo.properties nach Frühling geladen
Wenn Sie mehrere Konfigurationsdateien verwenden möchten, können Sie das Feld "Auftragsfeld zum Sortieren" hinzufügen
Verwenden Sie PropertySource, um die Konfiguration zu kommentieren
Spring 3.1 hat die @PropertySource -Annotation hinzugefügt, um das Hinzufügen von Eigenschaftsdateien in die Umgebung zu erleichtern.
@Configuration @propertySource ("classPath: foo.properties") öffentliche Klasse PropertiesWithjavaconfig {@Bean öffentlich static PropertySourcesaPlaTHORDORCONFIGURS -PropertySourcesaPlaTHOLCONFIGURER () {NEW -PropertySourcePlacePlaceConfigurer (); }}Injektion und Verwendung von Eigenschaften
1. Verwenden Sie @Value -Annotation, um in Java zu erhalten
@Value ("$ {jdbc.url}") private String jdbcurl;Sie können auch einen Standardwert hinzufügen
@Value ("$ {jdbc.url: adefaulturl}") private String jdbcurl;1. Holen Sie sich es in der XML -Konfigurationsdatei von Spring's XML
<bean id = "dataSource"> <Eigenschaft name = "url" value = "$ {jdbc.url}" /> < /bean>Quellcodeanalyse
Laden von Eigenschaftenkonfigurationsinformationen
Die Spring -Container -Initialisierung startet über abstractApplicationContext#Aktualisieren beim Start. In diesem Zeitraum werden LoadbeanDeFinitions anvertraut, um die XML -Konfigurationsdatei zu analysieren.
geschützte endgültige void refreshbeanFactory () löst Beansexception {if (hasBeanFactory ()) {destroyBeans (); CloseBeanFactory (); } try {DefaultListableBeanFactory beanfactory = createBeAnfactory (); BeanFactory.SetSerializationId (getId ()); CustomizeBeArfactory (Beanfactory); LoadbeanDeFinitions (Beanfactory); synchronisiert (this.beanFactoryMonitor) {this.beanfactory = beanfactory; }} catch (ioException ex) {throw New ApplicationContexception ("E/O -Fehler Parsinsing Bean Definition Quelle für" + getDisplayName (), Ex); }}LoadbeandeFinitions über die delegation von Layer-für-Layer-Delegation finden
Protected void ParsebeandeFinitions (Element Root, BeanDefinitionParSerDelegate Delegate) {if (delegate.isdefaultNameSpace (root)) {nodelist nl = root.getChildnodes (); für (int i = 0; i <nl.getLength (); i ++) {node node = nl.item (i); if (Knoteninstanzelement) {Element ele = (Element) Knoten; if (delegate.isdefaultNameSpace (ele)) {ParseDefaultElement (ELE, Delegate); } else {delegate.Parsecustomelement (ele); }}}} else {delegate.parsecustomelement (root); }} Da dies keine Standardklassendefinition ist, beauftragt es BeanDefinitionParSerDelegate analysiert, um zu analysieren
Finden Sie den entsprechenden Prozessor über NamespaceHandler, um den ContextNamePaceHandler zu finden, und finden Sie dann die Analyse von PropertyPlacePl darin
@Override public void init () {// Dies ist der Parser, den wir auf der Suche nach RegisterBeandeFinitionParser ("Immobilien-Placeholder", New PropertyPlaPleholderbeanDeFinitionParser ()); RegisterBeandefinitionParser ("Property-Override", New PropertyOverridbeanDeFinitionParser ()); RegisterBeandefinitionParser ("Annotation-Config", New AnnotationConfigbeanDefinitionParser ()); RegisterBeandefinitionParser ("Komponenten-Scan", neue KomponentencanbeandefinitionParser ()); RegisterBeANdeFinitionParser ("Lastzeit-Weaver", New LoadTimeWeaverbeandeFinitionParser ()); RegisterBeandefinitionParser ("Spring-konfiguriert", neuer SpringconfiguredbeanDefinitionParser ()); RegisterBeandefinitionParser ("Mbean-Export", New MbeanExportbeanDeFinitionParser ()); RegisterBeANdeFinitionParser ("Mbean-Server", New MbeanServerbeandeFinitionParser ()); } PropertyPlaPleholderbeanDefinitionParser steht im Mittelpunkt dieser Code -Analyse.
Werfen wir einen Blick auf seine Elternklasse.
1.BeanDefinitionParser
Verwendet ausfallbeandefinitionDocumentReader, um personalisierte Tags zu analysieren
Hier wird nur eine Parse -API definiert, die das Element analysiert
öffentliche Schnittstelle BeandefinitionParser {BeanDefinition Parse (Elementelement, ParserContext ParserContext);} 2.AbstractbeanDefinitionParser
Die Standard -abstrakte Implementierung der BeanDefinitionParser -Schnittstelle. Die Frühling ist gut darin. Es bietet hier viele bequeme APIs und verwendet das Entwurfsmuster der Vorlagenmethode, um benutzerdefinierte Implementierungshaken für Unterklassen bereitzustellen.
Werfen wir einen Blick auf die spezifische Verarbeitungslogik, wenn analysiert wird: Rufen Sie den Haken an Parzeinternal an, an Parse
3.. AbstractSinglebeanDefinitionParser
Analysieren, die abstrakte übergeordnete Klasse einer einzelnen BeanDefinition definieren,
In Parzeinternal, Parente Name, BeanClass, Quelle; und mit BeanDefinitionBuilder zusammenfassen
V
Analysieren Sie Eigenschaften im Zusammenhang mit Eigenschaften, wie Standort, Eigenschaften-Ref, Dateikodierung, Reihenfolge usw.
5.PropertyPlaceHolperbeanDefinitionParser
Hier gibt es nicht viele Dinge, die Sie hier befassen müssen, sondern nur in einem nicht lolvierbaren und systempropertischen Modus eingerichtet sind
Ladeeigenschaften Datei, Instanziierung von Bean laden
Schauen wir uns als nächstes einen Blick darauf an, wann diese Bohne instanziiert wird. Es gibt zwei Arten der Instanziierung allgemeiner Klassen. Eine wird so instanziiert, dass das Singleton -System begonnen wird. Der andere wird instanziiert, wenn der Nicht-Singleton (oder Singleton Lazy Loading), wenn die GetBean instanziiert ist.
Der Auslöser ist hier über BeanfcatoryPostProcessor.
BeanfactoryPostProcessor verändert die Bean -Definition vor der Bean -Instanziierung. Zum Beispiel werden die Platzhalter in der Bean -Definition hier gelöst, und die Eigenschaften, die wir jetzt verwenden, werden auch hier gelöst.
Dies wird durch Post -ProcessorRegistrationDelegate#InvokeBeAnfactoryPostProcessors implementiert.
Scannen Sie den BeanfactoryPostProcessor im Container, finden Sie hier die hier benötigte PropertySourcesaPlaceHolpleConFigur und instanziieren Sie ihn über die GetBean des Containers
Protected Void InvokeBeAnfactoryPostProcessors (configurablelistableBeArtory beanfactory) {PostprozessorregistrationDelegate.InvokeBeActoryPostProcessors (Beanfactory, getBeanFactoryPostProzessors ()); }Nach Abschluss von PropertySourcesPlaceHolpleConFigurer wird die Instanziierung direkt und geladene Informationen ausgelöst.
OrderComparator.sort (priorityorderedPostProcessoren); InvokeBeanFactoryPostProcessoren (vorrangig angeordnete Prozessoren, Beanfactory);
Schauen wir uns das Erbssystem von PropertySourcesaPlaceHolpleConFigurer an
1.BeanFactoryPostProcessor
Definieren Sie eine Schnittstelle zum Ändern der Eigenschaften der Bean -Definition in einem Container. Die Implementierungsklasse wird so instanziiert, bevor allgemeine Klassen verwendet werden und die Eigenschaften anderer Klassen geändert werden.
Dies unterscheidet sich offensichtlich von BeanPostProcessor, der Bean -Instanzen verändert.
2.PropertiesloaderSupport
Zusammenfassung Klasse, die Eigenschaftendateien lädt.
Die spezifische Ladelogik hier besteht darin, Propertiesloaderutils#fillProperties zur Implementierung anzuvertrauen
3.PropertyresourceConfiger
Der Ersatz von Platzhaltern in der Bean -Definition wird von dieser abstrakten Klasse implementiert.
Implementieren Sie BeanfactoryPostProcessor#postProcessbeanFactory, iterieren Sie die Klassendefinition im Container und ändern Sie sie
So ändern Sie es wird implementiert, indem Sie es einer Unterklasse über die Hook ProcessProperties übergeben
4.PLACEHALTERCONFIGURERSUPPORT
Verwenden Sie das Besucherdesign -Muster, um Eigenschaften über BeanDefinitionvisitor und StringValueresolver zu aktualisieren
StringValUeresolver ist eine Schnittstelle, die Datenstationstypdaten umwandelt. Die API -Implementierung, die die Eigenschaften wirklich aktualisiert
PropertyPlaceHolderHelper#ParsestringValue
5.PropertySourcesPlaceHoldConFigurer
Überschreiben Sie den PostprozessorbeanFactory -API -Definitionsprozess
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.