Vorwort
Mit der zunehmenden Beliebtheit von Spring Boot sind die meisten Konfigurationen in der Anwendung versteckt. Wir müssen uns nur um den realen Geschäftsinhalt, den Controller, den Service, den Repository und die Tastatur kümmern, und wenn Sie die Tastatur abholen, können Sie eine Kopie der Geschäftsordnung verwenden. Der spezifische Komponenten -Scan, die Ansicht, der Platzhalter ... kann zurückgelassen werden. Tatsächlich ist diese Nullkonfiguration in der Java -Anwendungsentwicklung nicht lang. "Es ist schwierig, von extravagant zur Genügsamkeit zu gelangen." Viele Entwickler haben die langwierige Feder -XML -Konfiguration erlebt, und es ist wirklich schwierig, auf diese Konfiguration zurückzukehren.
Da der Konfigurationsinhalt jedoch in einer Nullkonfiguration wie Spring Start nicht gut implementiert ist, müssen wir das XML -Konfigurationsformular noch verwenden und dann importsource ein Importieren oder einige Projekte sind von der Umgebung beeinflusst und werden nicht mit dem Boot entwickelt, sodass sie auch ein gewisses Verständnis der Konfiguration haben müssen.
Schauen wir uns dann auf einige der benutzerdefinierten Schema -Inhalte in der XML -Konfiguration zurück, wie einige benutzerdefinierte Schema -Inhalte zur Konfiguration in Spring integriert werden. Zum Beispiel:
Federdaten ES
Dubbo
Es gibt viele solche Beispiele, dass wir sie nacheinander nicht auflisten werden. In den beiden oben genannten Figuren finden wir jedoch ein gemeinsames Merkmal:
Wann funktionieren diese benutzerdefinierten Konfigurationen? Wie überprüfen Sie, ob die Konfiguration korrekt ist?
Schauen wir uns die Frühling an, die eine Datei namens Spring.Handlers enthält. Alle benutzerdefinierten Erweiterungen werden durch diese Datei wirksam. Frühlingsbeamter AOP und TX haben auch dieses Prinzip.
Wo ist diese Datei?
Wie in der obigen Abbildung gezeigt, handelt es sich um meta-inf/fing.handler. Der Dateiinhalt ist auch super einfach:
http/: //www.springframework.org/schema/data/elasticsearch=org.springframework.data.elasticsearch.config.elasticsearchnameSpaceHandler
Das erste ist das Präfix jedes Schemas, und das nächste ist die Parsing -Klasse, die dem Schema entspricht. Wann wird die Datei Spring.Handlers geladen?
Dies geschieht auch beim Parsen der benutzerdefinierten Konfigurationsdatei. Es gibt einen Auflösungsvorgang. Zu diesem Zeitpunkt werden alle Spring.Handlers -Dateien, die dem aktuellen Klassenloader entsprechen, geladen.
Schauen wir uns diese Analyseklasse erneut an, der Inhalt lautet wie folgt:
öffentliche Klasse ElasticSearchNameSpaceHandler erweitert nameSpaceHandlersupport {public ElasticSearchNameSpaceHandler () {} public void init () {repositoryConfigurationSextension Erweiterung = new ElasticsearchRepositoryConFigextesion (); RepositorybeanDeFinitionParser Parser = New RepositorybeanDeFinitionParser (Erweiterung); this.registerBeanDefinitionParser ("Repositories", Parser); this.registerBeanDefinitionParser ("Node-Client", neuer nodeclientbeandefinitionParser ()); this.registerBeanDefinitionParser ("Transport-Client", New TransportClientbeanDeFinitionParser ()); }} Erstens wird es von namesapceHandlersupport geerbt
Dann ist eine Reihe von Parsers in der umgeschriebenen Init -Methode registriert. Jeder Parser entspricht einer Zeichenfolge, die der benutzerdefinierte Inhalt ist, den wir in der XML -Konfigurationsdatei verwenden, z. B. die obige ES -Konfiguration
<Elasticsearch: Transport-Client ID = "Client" cluster-nodes = "192.168.73.186:9300" Cluster
Die Konfiguration hier wird schließlich durch TransportClientbeanDeFinitionParser analysiert
Die oben genannten Parser werden in der Init-Methode in einer Karte gespeichert
private endgültige Karte <String, BeanDefinitionParser> Parsers = new HashMap ();
Die sogenannte Registrierung von Parsers besteht darin, die Karte dieser Parsers zu platzieren.
Rückblickend, was ist der Kerninhalt im Frühling? Es ist Bean. Tatsächlich wird der Inhalt, den wir in XML konfigurieren, schließlich in einer entsprechenden Bean erzeugt. Alle Konfigurationen dienen nur dazu, Bohnen zu erzeugen. Diese benutzerdefinierten Konfigurationen werden als BeanDefinition bezeichnet.
Daher gibt es beim Spring -Parsen der Konfigurationsdatei das folgende Urteil: Unabhängig davon, ob es sich um einen Standard -NamesPace handelt. Wenn nicht, gehen Sie zu CustomelementParse
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)) {this.ParseDeFaultElement (ele, delegate); } else {delegate.Parsecustomelement (ele); }}}} else {delegate.parsecustomelement (root); }} Stattdessen ist das Urteil, das nicht defaultnamespace ist
public boolean isdefaultNameSpace (String nameSpaceuri) {return! Stringutils.hasLength (nameSpaceuri) || "http://www.springframework.org/schema/beans".equals(NamePaceuri); } Die Anfragen gingen also alle an Parsecustomelement, und die Konfigurationsanalyse begann hier. Bei Parse wurde der entsprechende Handler durch Uriresolver gefunden
public beandefinition parsecustomelement (Element ELE, BeanDefinition enthältBD) {String nameSpaceuri = this.getNameSpaceuri (ELE); NamespaceHandler -Handler = this.reeaCertext.getNameSpaceHandLresolver (). Resolve (Namespaceuri); if (Handler == null) {this.Eror ("" Spring NamespaceHandler nicht für XML -Schema -Namespace [" + namespaceuri +"] ", Ele); null zurückkehren; } else {return handler.parse (ele, neuer ParserText (this.reaceContext, this, enthältBD)); }} Zu diesem Zeitpunkt ist das einzige, was zurückgegeben wird, der im Frühjahr konfigurierte Handler.
public beandefinition analyse (Elementelement, ParserContext ParserContext) {return this.findParserForElement (Element, ParserContext) .Parse (Element, ParserContext); } private BeanDefinitionParser findParserForElement (Elementelement, ParserContext ParserContext) {String localname = parserContext.getDelegate (). getLocalName (Element); BeanDefinitionParser Parser = (BeanDefinitionParser) this.parsers.get (LocalName); if (parser == null) {parserContext.getreadertext (). Fatal ("kann beandefinitionsparser für Element [" + localname + "]", Element) nicht lokalisieren; } return Parser; } Der Prozess des Erhaltens ist darin, den entsprechenden Parser in der Karte zu erhalten, die wir durch die in den übergebene Zeichenfolge deklarieren, und es dann zur Konfigurationsanalyse verwenden.
Mit Parser wird der Prozess der Erzeugung von BeanDefinition befolgt.
Wir sehen, dass diese Parsers von AbstractBeanDeFinitionParser geerbt werden oder die Schnittstelle von BeanDefinitionParser implementieren. Die Schnittstellen -Parse -Methode ist der Eingang zum einheitlichen Parsing.
öffentliche Klasse TransportclientbeanDeFinitionParser erweitert abstractbeanDeFinitionParser {public transportClientBeAnDeFinitionParser () {} Protected AbstractBeNDeFinition Parseinternal (Element Element, ParserContext ParserContext) {BEANDEFINITIONBUIMERBUIMERBUIMERBUIMERBUILDBUIMERBUILDBUIMERBULICER BUILDER BUILDER BUILDER = BeanDefinitionBuilder.RootbeanDefinition (TransportClientFactoryBean.class); this.setConfigurations (Element, Builder); return this.getSourcedbeandefinition (Builder, Element, ParserContext); }} Geben Sie nach Analyse der Konfiguration die entsprechende BeanDefinition zurück. Dies ist auch ein Ort, an dem verschiedene Frameworks frei abstrahiert werden. Beispielsweise sind einige Frameworks einfach und unkompliziert, während einige einige Designmuster wie Strategien und Dekorateure anwenden, um mehr Flexibilität zu bieten.
Nachdem Sie die BeanDefinition erhalten haben, setzen Sie sie in den gesamten Kontext, um den Inhalt der Frühlingsbohnen zu erzeugen, und wir werden es später analysieren.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.