L'apprentissage le plus détaillé de springboot sur le Web - day02

Directeur d'usine Java 2021-10-14 05:01:04
apprentissage le taill springboot sur


Explorer les principes de fonctionnement

Nous avons écritHelloSpringBoot,Comment ça marche?,MavenProjets,Nous commençons généralement parpom.xmlDébut de la recherche documentaire;

1、Le père dépend

pom.xml

  • Configuration automatique
  • spring-boot-dependencies:Les dépendances du noyau sont dans le projet parent!
  • Nous écrivons ou introduisonsSpringbootQuand on est dépendant,La version spécifiée n'est pas nécessaire,Juste parce qu'il y a ces versions de l'entrepôt

1、Où il dépend principalement d'un projet parent,Principalement pour gérer le filtrage des ressources et les plug - ins du projet!

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>

2、À l'intérieur.,J'ai trouvé une autre dépendance parentale.

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.4</version>
</parent>

3、 C'est la vraie gestion. SpringBootToutes les versions dépendantes de l'application,SpringBootCentre de contrôle de version pour;

4、Par défaut, nous n'avons pas besoin d'écrire la version pour importer des dépendances à l'avenir.; Mais si le paquet importé n'est pas géré dans une dépendance, vous devez configurer manuellement la version ;

2、Démarreur spring-boot-starter

  • Dépendance

    <dependency> <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
  • springboot-boot-starter-xxx,C'est tout.Springboot Scénario de démarrage pour

  • Par exemple,spring-boot-starter-web, Il nous aidera à importer automatiquement webToutes les dépendances de

  • springboot Tous les scénarios fonctionnels , Sont devenus des initiateurs individuels

  • Quelles fonctions allons - nous utiliser? , Il suffit de trouver l'initiateur correspondant. start

3、Procédure principale

3.1、Classe de démarrage primaire par défaut

package com.sxau;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication Pour marquer une classe de programme principale
//Ça veut dire que c'est unSpring BootApplication
public class Springboot01HelloworldApplication {

// J'ai cru qu'il y avait un moyen. , Je ne m'attendais pas à démarrer un service. 
public static void main(String[] args) {

SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}

Mais** Une simple classe de démarrage n'est pas facile !** Analysons ce que ces notes ont fait.

3.2、Notes(@SpringBootApplication)

  • Action:L'annotation d'une classe indique que cette classe estSpringBoot Configuration principale pour

  • SpringBootC'est la classe qui devrait fonctionner.mainMéthode de démarrageSpringBootApplication;

  • Entrez cette note:Comme vous pouvez le voir, il y a beaucoup d'autres annotations!

    @SpringBootConfiguration springbootConfiguration de
    @Configuration springConfigurer la classe
    @Component La description est une springComposants de
    @EnableAutoConfiguration Importer automatiquement des paquets
    @ComponentScan( Numériser les paquets de la classe de démarrage principale actuelle
    excludeFilters = {
    @Filter(
    type = FilterType.CUSTOM,
    classes = {
    TypeExcludeFilter.class}
    ), @Filter(
    type = FilterType.CUSTOM,
    classes = {
    AutoConfigurationExcludeFilter.class}
    )}
    )
    // @interface Interface personnalisée
    public @interface SpringBootApplication {
    
    // ......
    }
    

@ComponentScan

  • Cette note est disponible enSpringC'est important. ,Ça correspond.XMLÉléments de configuration.

  • Action:Numériser et charger automatiquement les composants admissibles oubean , Prends ça.beanDéfinition chargée dansIOCDans le récipient

@SpringBootConfiguration

  • Action:SpringBootClasse de configuration pour ,Dimension sur une classe , Ça veut dire que c'est unSpringBootClasse de configuration pour;

  • Passons à l'annotation.

    // Allumez - le et obtenez - le en bas. @Component
    @Configuration
    public @interface SpringBootConfiguration {
    
    @AliasFor( //@AliasForDéfinir un alias
    annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
    }
    @Component
    public @interface Configuration {
    }
    
  • Ici. @Configuration,Ça veut dire que c'est unspringClasse de configuration pour ,La classe de configuration correspondSpringDexml Profil;

  • @Component Ça veut dire,La classe de démarrage elle - mêmeSpringUn des composantsC'est juste,Responsable du démarrage de l'application!

  • On revient. SpringBootApplication Continuer à lire dans les notes .

@EnableAutoConfiguration

  • Activer la fonction de configuration automatique

    • Ce que nous avions besoin de configurer nous - mêmes,Et maintenantSpringBootPeut être configuré automatiquement pour nous ;
    • @EnableAutoConfigurationDis - le.SpringBootActiver la fonction de configuration automatique,Pour que la configuration automatique prenne effet;

    Voir la suite des notes de pointage :

  • @AutoConfigurationPackage :Paquet de configuration automatique

    @Import({
    Registrar.class})
    public @interface AutoConfigurationPackage {
    
    }
    
    • @import :SpringNotes de bas niveau@import , Importer un composant dans un conteneur

    • Registrar.class Action: Configurer automatiquement l'enregistrement des paquets ,Numériser le paquet dans lequel se trouve la classe de démarrage principale et tous les composants de tous les sous - paquets sous le paquet àSpringConteneur ;

    • Cette analyse est terminée. , Retour à l'étape précédente ,Continue de regarder.

  • @Import({AutoConfigurationImportSelector.class}) :Importer des composants pour le conteneur ;

    • AutoConfigurationImportSelectorConfigurer automatiquement le sélecteur d'importation, Quel sélecteur de composants importe - t - il? ? Nous cliquons sur cette classe pour voir le code source :

      // Obtenir toutes les configurations 
      List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
      
    • Obtenir une configuration candidate

      protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
      
      // Correspond à la méthode suivante 
      //Ici.getSpringFactoriesLoaderFactoryClass()Méthodes
      //Le retour est la classe d'annotation que nous avons d'abord vue pour démarrer le Profil d'importation automatique;EnableAutoConfiguration
      List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
      Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
      return configurations;
      }
      // Et les méthodes de la classe ci - dessus loadFactoryNames Le premier paramètre correspond 
      //Ici.getSpringFactoriesLoaderFactoryClass()Méthodes
      //Le retour est la classe d'annotation que nous avons d'abord vue pour démarrer le Profil d'importation automatique;EnableAutoConfiguration
      protected Class<?> getSpringFactoriesLoaderFactoryClass() {
      
      return EnableAutoConfiguration.class;
      }
      
    • Cette méthodegetCandidateConfigurations()Encore appelé SpringFactoriesLoader Méthode statique de la classe!Nous entrons dansSpringFactoriesLoaderCatégorieloadFactoryNames() Méthodes, Obtenir toutes les configurations de chargement

      public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
      
      String factoryClassName = factoryClass.getName();
      //Ici, il appelle à nouveau loadSpringFactories Méthodes
      return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
      }
      
    • Nous continuons à cliquer pour voir loadSpringFactories Méthodes

      • Ressources du projet:META-INF/spring.factories
      • Ressources du système:META-INF/spring.factories
      • image-20210921193031067
      • Toutes configurées à partir de ces ressources nextElement(Configuration automatique), Sous - Assemblée properties
      // Charger toutes les ressources dans la classe de configuration ( Extraire les éléments suivants de l'analyse ,No13D'accord)
      Properties properties = PropertiesLoaderUtils.loadProperties(resource);
      
      private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
      
      //ObtenirclassLoader , Et ce que nous pouvons voir en revenant ici, c'est queEnableAutoConfigurationClasse annotée elle - même
      MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
      if (result != null) {
      
      return result;
      } else {
      
      try {
      
      //Pour obtenir une ressource "META-INF/spring.factories"
      Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
      LinkedMultiValueMap result = new LinkedMultiValueMap();
      // Déterminer s'il y a d'autres éléments , Boucler les ressources lues ,Encapsulé dans unProperties
      while(urls.hasMoreElements()) {
      
      URL url = (URL)urls.nextElement();
      UrlResource resource = new UrlResource(url);
      Properties properties = PropertiesLoaderUtils.loadProperties(resource);
      Iterator var6 = properties.entrySet().iterator();
      while(var6.hasNext()) {
      
      Entry<?, ?> entry = (Entry)var6.next();
      String factoryClassName = ((String)entry.getKey()).trim();
      String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
      int var10 = var9.length;
      for(int var11 = 0; var11 < var10; ++var11) {
      
      String factoryName = var9[var11];
      result.add(factoryClassName, factoryName.trim());
      }
      }
      }
      cache.put(classLoader, result);
      return result;
      } catch (IOException var13) {
      
      throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
      }
      }
      }
      
    • Un fichier récurrent a été trouvé :spring.factories, Recherche globale

3.3、spring.factories

On l'ouvre à la source.spring.factories , J'ai vu beaucoup de fichiers configurés automatiquement;C'est la racine de la configuration automatique!

image-20210921195101082

WebMvcAutoConfiguration

Nous allons ouvrir la classe de configuration automatique ci - dessus.,Par exemple, :WebMvcAutoConfiguration

image-20210921195140550

Vous pouvez voir que chacun d'eux estJavaConfigConfigurer la classe,Et en a injecté un peu.Bean,Vous pouvez trouver des classes que vous connaissez, Regarde et familiarise - toi. !

Alors...,L'implémentation réelle de la configuration automatique est declasspathRechercher tousMETA-INF/spring.factoriesProfil ,Et mettre le org.springframework.boot.autoconfigure. Éléments de configuration sous paquet,Les dimensions correspondantes sont instantanées par réflexion@ConfigurationDeJavaConfigLa formeIOCClasse de configuration du conteneur , Ensuite, résumez - les en une seule instance et chargez - les dansIOCDans le récipient.

4、Conclusions:

  1. SpringBootDepuis le chemin de classe au démarrageMETA-INF/spring.factoriesAccès moyenEnableAutoConfigurationValeur spécifiée
  2. Importer ces valeurs dans le conteneur en tant que classe de configuration automatique , La classe de configuration automatique prend effet , Aidez - nous à automatiser la configuration;
  3. Ce que nous avions besoin de configurer automatiquement ,MaintenantspringbootIl l'a fait pour nous.
  4. IntégrationJavaEE, La solution globale et la configuration automatique springboot-autoconfigureDejarDans le sac;
  5. Il prend tous les composants à importer , Renvoie comme nom de classe ,Ces composants sont ajoutés au conteneur
  6. Il importe beaucoup de classes de configuration automatique dans le conteneur (xxxAutoConfiguration), Est d'importer tous les composants nécessaires pour cette scène dans le conteneur , Et configurer automatiquement ,@Configuration(javaConfig) ;
  7. Avec la classe de configuration automatique , Nous avons éliminé le travail d'écriture manuelle pour configurer les composants de la fonction d'injection, etc. ;

Maintenant, tout le monde devrait avoir un aperçu. ,SpringBootPrincipe de fonctionnement, Nous approfondirons encore une fois. !

Démarrage

1、 Pas facile.

J'ai d'abord pensé que j'en avais un. mainMéthodes, J'ai ouvert un service. ;

package com.sxau;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //Pour marquer une classe de programme principale
//Ça veut dire que c'est unSpring BootApplication
public class Springboot01HelloworldApplication {

//Cette méthode renvoie unConfigurableApplicationContextObjet
//Paramètre 1: Classe d'entrée de l'application ; Paramètre 2:Paramètres de la ligne de commande 
public static void main(String[] args) {

SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}

SpringApplication.runAnalyse

  • La méthode est divisée en deux parties.
  • Un.SpringApplicationInstanciation de,
  • Deux.runExécution de la méthode;

2、SpringApplication

Cette classe fait principalement les quatre choses suivantes::

  1. Déduire si le type d'application est normal ouWebProjets

  2. Trouver et charger tous les initialisateurs disponibles , Set toinitializersDans les propriétés

  3. Trouver tous les auditeurs d'application,Set tolistenersDans les propriétés

  4. Extrapoler et définirmainClasse de définition de la méthode,Trouver la classe principale en cours d'exécution

Voir le constructeur

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {

this.sources = new LinkedHashSet();
this.bannerMode = Mode.CONSOLE;
this.logStartupInfo = true;
this.addCommandLineProperties = true;
this.addConversionService = true;
this.headless = true;
this.registerShutdownHook = true;
this.additionalProfiles = Collections.emptySet();
this.isCustomEnvironment = false;
this.lazyInitialization = false;
this.applicationContextFactory = ApplicationContextFactory.DEFAULT;
this.applicationStartup = ApplicationStartup.DEFAULT;
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
this.bootstrappers = new ArrayList(this.getSpringFactoriesInstances(Bootstrapper.class));
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = this.deduceMainApplicationClass();
}

3、runAnalyse du processus méthodologique

img

Suivez le code source et cette image et vous pouvez l'explorer. !

4、À propos deSpringBoot, Parlez de votre compréhension ;

  • Montage automatique
  • run()
  • Prise en charge complèteSpringMVCConfiguration de
版权声明
本文为[Directeur d'usine Java]所创,转载请带上原文链接,感谢
https://javamana.com/2021/10/20211013211944109A.html

  1. What are the new features of Java 10?
  2. What are the new features of Java 9?
  3. Is the report too ugly? Try this open source project reportplus!
  4. Spring 2021 report released: who is the real brother?
  5. À bientôt, docker.
  6. Recommend a super easy to use markdown editor
  7. Java 17 new features overview
  8. New developer friendly features after Java 8
  9. Concise and efficient eclipse collections API
  10. Practice of deploying spring boot microservices on kubernetes
  11. Garbage collectors in the new JDK: Shenandoah, ZGC and improved G1
  12. À bientôt, docker.
  13. Oracle exécute le format syntaxique d'une procédure stockée ou d'un lot
  14. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  15. The Linux kernel will be implemented with the latest zstd
  16. JetBrains publishes the raw data of the developer ecosystem survey in 2021
  17. Linux 5.16 will support KVM and disable amd PSF function
  18. Linux 5.16 brings DisplayPort 2.0 initial support for amdgpu driver
  19. Announcement of the election results of the technical advisory committee of the Linux foundation in 2021
  20. Java虚拟机|JVM【适合初学者入门】
  21. Spring Cloud 2021.0.0-M2 发布
  22. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  23. Spring Cloud 2021.0.0-M2 發布
  24. Java虛擬機|JVM【適合初學者入門】
  25. Spring Cloud 2021.0.0-m2 Release
  26. Machine virtuelle Java | JVM [convient aux débutants]
  27. 10412 Xiaopeng cars announced sales results in September
  28. Apprendre le mécanisme des événements Java
  29. Java script RPC (07) - timeout timeout Processing from zero
  30. Introduction à la page Web de rabbitmq (3)
  31. MySQL read - Write Separation Cluster Construction and Integration with mycat
  32. Analyse du principe du conteneur du CIO printanier
  33. Java面向对象基础
  34. Java communique avec les capteurs industriels via socket et DTu, RTU
  35. Xiaopeng automobile delivered 10412 units in September, with a monthly sales volume of more than 10000 for the first time
  36. Java Object Oriented Foundation
  37. Introduction au développement Android PDF, un tour pour vous apprendre à comprendre netty
  38. Hadoop Foundation - 01 - concepts de base
  39. Hadoop Foundation - 02 - Basic Structure
  40. Hadoop Foundation - 03 - hdfs (Hadoop Distributed File System) Basic Concepts
  41. Hadoop Foundation - 04 - hdfs API Programming
  42. Hadoop Foundation - 05 - hdfs Project (word Frequency Statistics)
  43. Hadoop Foundation - 06 - hdfs Data Read and write
  44. The "monthly test" report card of the new car built under the lack of core: Xiaopeng and Weilai took the lead in "breaking 10000", and the ideal plummeted by 25%
  45. Introduction to making arch linux software package
  46. Hard core observation 407 HTTPS everywhere browser extension is about to retire
  47. How to use busybox on Linux
  48. In 2021, the talent incentive plan of Linux foundation open source software School Park was officially launched
  49. It's not windows or Linux. Shrink is the "God operating system"
  50. Install anydesk on Ubuntu Linux
  51. 2021, can we recommend using Linux to play games?
  52. not exist:org.springframework.kafka.listener.AbstractMessageListenerContaingetContainerProperties()
  53. Are you sure HTTPS is asymmetric encryption for content encryption? See the answers and reasons
  54. MySQL online slow log query
  55. Java JDK server installation
  56. 手把手教你使用Java开发在线生成pdf文档
  57. Questions d'entrevue dans la base de données MySQL (dernière version 2021)
  58. Java零基础小白入门必做题汇总(建议收藏)第一篇
  59. Day15 Java Foundation
  60. Day16 Java Foundation