Préface
Avec la popularité croissante de Spring Boot, la plupart des configurations de l'application sont cachées. Nous avons seulement besoin de nous soucier du contenu commercial réel, du contrôleur, du service, du référentiel, et lorsque vous récupérez le clavier, vous pouvez utiliser une copie du code commercial. La numérisation des composants spécifiques, la vue, l'espace réservé ... peuvent être laissées pour compte. Mais en fait, cette configuration zéro n'est pas longue dans le développement d'applications Java. "Il est difficile de passer de l'extravagant à la frugalité." De nombreux développeurs ont connu la longue configuration Spring XML, et il est vraiment difficile de revenir à cette configuration.
Mais parfois, comme le contenu de configuration n'est pas bien implémenté dans une configuration zéro comme Spring Boot, nous devons toujours utiliser le formulaire de configuration XML, puis l'importation. Ou certains projets sont affectés par l'environnement et ne sont pas développés en utilisant le démarrage, ils doivent donc également avoir une certaine compréhension de la configuration.
Revenons ensuite sur une partie du contenu du schéma personnalisé dans la configuration XML, comment un contenu de schéma personnalisé est intégré à Spring pour la configuration. Par exemple:
Données de printemps es
dubo
Il existe de nombreux exemples de ce type que nous ne les énumérons pas un par un. Mais à travers les deux figures ci-dessus, nous trouvons une caractéristique commune:
Alors, quand ces configurations personnalisées fonctionnent-elles? Comment vérifier si la configuration est correcte?
Regardons le printemps contenant un fichier nommé Spring.Handlers. Toutes les extensions personnalisées entrent en vigueur via ce fichier. Le responsable du printemps AOP et TX ont également ce principe.
Où est ce fichier?
Comme le montre la figure ci-dessus, il s'agit de méta-infr / printemps. Le contenu du fichier est également super simple:
http /: //www.springframework.org/schema/data/elasticsearch=org.springframework.data.elasticsearch.config.elasticsearchNamespaceHandler
Le premier est le préfixe de chaque schéma, et le suivant est la classe d'analyse correspondant au schéma. Quand le fichier Spring.Handlers est-il chargé?
Cela se produit également lors de l'analyse du fichier de configuration personnalisé. Il y a un processus de résolution. À l'heure actuelle, tous les fichiers Spring.Handlers correspondant au chargeur de classe actuel seront chargés.
Regardons à nouveau cette classe d'analyse, le contenu est le suivant:
classe publique ElasticsearchNamespaceHandler étend des noms de nomshandlersupport {public elasticsearchNamespaceHandler () {} public void init () {RepositoryConfigurationExtension extension = new elasticsearchrepositoryconfigextension (); RepositoryBeAnDeFinitionParser Parser = new RepositoryBeAnDeFinitionParser (Extension); this.RegisterBeAnDefinitionParser ("Repositaires", analyseur); this.RegisterBeAnDefinitionParser ("Node-Client", new NodeClientBeAnDeFiniitionParser ()); this.RegisterBeAnDefinitionParser ("Transport-Client", New TransportClientBeAnDefinitionParser ()); }} Tout d'abord, il est hérité de NameSapceHandlersupport
Ensuite, une série d'analyseurs est enregistré dans la méthode INIT réécrite. Chaque analyseur correspond à une chaîne, qui est le contenu personnalisé que nous utilisons dans le fichier de configuration XML, comme la configuration ES ci-dessus
<elasticsearch: transport-client id = "client" cluster-nodes = "192.168.73.186:9300" Cluster
La configuration ici sera éventuellement analysée via TransportClientBeAndeFiniitionParser
Les analyseurs susmentionnés sont stockés sur une carte de la méthode init
Carte finale privée <String, beanDeFinitionParser> parser = new HashMap ();
Le soi-disant enregistrement des analyseurs est de mettre la carte de ces analyseurs.
Avec le recul, quel est le contenu le plus principal du printemps? C'est du haricot. En fait, le contenu que nous configurons dans XML sera finalement généré dans un bean correspondant. Toutes les configurations sont juste pour générer des haricots. Ces configurations personnalisées sont appelées BeanDefinition.
Par conséquent, lorsque Spring analyse le fichier de configuration, il y aura le jugement suivant: qu'il s'agisse de DefaultNamespace. Sinon, allez sur CustomElementParse
Protégé void parsebeAndefinitions (élément root, beandefinitionParserDelegate Delegate) {if (delegate.isdefaultNamespace (root)) {nodelist nl = root.getchildNodes (); pour (int i = 0; i <nl.getLength (); ++ i) {node node = nl.item (i); if (nœud instanceof élément) {element ele = (élément) node; if (delegate.isdefaultNamespace (ele)) {this.parsedefaultElement (ele, délégué); } else {delegate.parsECustomElement (ele); }}}} else {delegate.parsECustomElement (root); }} Au lieu de cela, le jugement qui n'est pas par défaut de Namespace est plus direct: l'espace de noms a-t-il un contenu, ou est-ce une déclaration de haricots printaniers
public boolean isdefaultNamespace (String namespaceuri) {return! stringUtils.hasLength (namespaceuri) || "http://www.springframework.org/schema/beans".equals(Namespaceuri); } Ainsi, les demandes ont toutes été allés à PARSECUSTOMEMENT et l'analyse de configuration a commencé ici. Lorsque l'analyse, le gestionnaire correspondant a été trouvé par Uriresolver
public beanDefinition PARSECUSUMELlement (élément ele, beanDefinition contientbd) {String namespaceuri = this.getNamespaceuri (ele); NamespaceHandler handler = this.readerContext.getNamespaceHandlerresolver (). Resolve (namespaceuri); if (handler == null) {this.error ("Impossible de localiser Spring NamespaceHandler pour xml schéma namespace [" + namespaceuri + "]", ele); retourner null; } else {return handler.parse (ele, new ParserContext (this.readerContext, this, contenantbd)); }} À l'heure actuelle, la seule chose qui est retournée est le gestionnaire configuré dans Spring.Handlers, et chaque gestionnaire enregistre beaucoup d'analyse, et un processus d'obtention d'analyseurs est nécessaire.
Public BeanDefinition Parse (élément Element, ParserContext ParserContext) {return this.findParserForElement (élément, ParserContext) .Parse (élément, ParserContext); } private beanDeFinIitionParser findSParserForElement (élément élément, ParserContext ParserConText) {String localName = ParserContext.getdelegate (). getLocalName (élément); BeanDefinitionParser parser = (beanDefinitionParser) this.parsers.get (nom local); if (parser == null) {ParserConText.GetReaderConText (). FATAL ("Impossible de localiser BeanDefinitionParser pour élément [" + localName + "]", élément); } Retour analyseur; } Le processus d'obtention de ceci consiste à obtenir l'analyseur correspondant dans la carte que nous commençons à déclarer via la chaîne transmise, puis à l'utiliser pour l'analyse de configuration.
Avec l'analyseur, le processus de génération de haricotrie est suivi.
Nous voyons que ces analyseurs sont hérités de l'abstractBeAnDefinitionParser, ou implémentent l'interface de BeanDefinitionParser. La méthode d'analyse d'interface est l'entrée de l'analyse unifiée.
classe publique TransportClientBeAnDefinitionParser étend AbstractBeAndeFinitionParser {Public TransportClientBeanDefinitionParser () {} AbstractBeAnDeanDefinition Parseinternal (élément Element, ParserContext ParserContex BeanDefinitionBuilder.RootBeAndefinition (TransportClientFactoryBean.class); this.setConfigurations (élément, constructeur); Renvoie ce.getsourcedBeAnDefinition (constructeur, élément, ParserContext); }} Dans la méthode par mine de parteinternal réécrite, renvoyez le BeanDefinition HEAGE correspondant après l'analyse de la configuration. C'est également un endroit où divers cadres sont librement abstraits. Par exemple, certains cadres sont simples et simples, tandis que certains appliqueront certains modèles de conception tels que les stratégies et les décorateurs pour offrir plus de flexibilité.
Après avoir obtenu le haricot, mettez-le dans tout le contexte pour générer le contenu de Spring Bean, et nous l'analyserons plus tard.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.