编程知识 cdmana.com

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

Principe de configuration automatique

À propos de l'auteur

Page d'accueil du blog:Page d'accueil de l'auteur

Introduction:JAVADomaine créateur de haute qualité、Un étudiant de troisième année、Participer à diverses compétitions provinciales pendant l'école、National race,Une série d'honneurs.

Concentre - toi sur moi.:Suivez mon matériel d'apprentissage、Tous les téléchargements de documents sont disponibles,Mise à jour quotidienne des articles,Inspirez - vous en tant queJAVASenior Program singe.

Qu'est - ce qu'un profil écrit exactement?Comment écrire??----Contact---- spring.factories

SpringBootIl y a beaucoup de configurations dans les documents officiels,Nous ne pouvons pas tous nous souvenir,Site officiel:Common Application properties (spring.io)

image-20210926163404573

Analyse du principe de configuration automatique

  1. SpringBootCharger la classe de configuration principale au démarrage,La fonction de configuration automatique est activée @EnableAutoConfiguration

  2. @EnableAutoConfiguration Action

  • UtilisationEnableAutoConfigurationImportSelectorImporter des composants dans le conteneur

    image-20210927115132764

    • Vous pouvez voirselectImports()Contenu de la méthode, Il est revenu avec un String[]Un tableau de chaînes,Dethis.getAutoConfigurationEntry(annotationMetadata); Cette méthode nous permet de suivre :

    image-20210926181942620

    • C'estgetAutoConfigurationEntry La méthode a une valeur :List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); Appelé obtenir une configuration candidate , Nous cliquons pour continuer à suivre

      image-20210926175831652

    • SpringFactoriesLoader.loadFactoryNames()

      image-20210926180418657

    • Scanner toutjarSous le chemin de classe du paquetMETA-INF/spring.factories

    • Emballez le contenu de ces fichiers numérisés danspropertiesObjet

    • DepropertiesDansEnableAutoConfiguration.classCatégorie(Nom de la classe)La valeur correspondante,Et les ajouter au récipient

    • Sous classpath ,META-INF/spring.factoriesTout ce qui est configuré à l'intérieurEnableAutoConfigurationValeur ajoutée au conteneur:

      image-20210926182258016

      # Initializers
      org.springframework.context.ApplicationContextInitializer=\
      org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
      org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
      
      # Application Listeners
      org.springframework.context.ApplicationListener=\
      org.springframework.boot.autoconfigure.BackgroundPreinitializer
      
      # Auto Configuration Import Listeners
      org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
      org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
      
      # Auto Configuration Import Filters
      org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
      org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
      org.springframework.boot.autoconfigure.condition.OnClassCondition,\
      org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
      
      # Auto Configure
      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
      org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
      org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
      org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
      org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
      org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
      org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
      org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
      org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
      org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
      org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
      org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
      org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
      org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
      org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
      org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
      org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
      org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
      org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
      org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
      org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
      org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
      org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
      org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
      org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
      org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
      org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
      org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
      org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
      org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
      org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
      org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
      org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
      org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
      org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
      org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
      org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
      org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
      org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
      org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration,\
      org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
      org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
      org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
      org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
      org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
      org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
      org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
      org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
      org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
      org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
      org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
      org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
      org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
      org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
      org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
      org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
      org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
      org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
      org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
      org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
      org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
      
      # Failure analyzers
      org.springframework.boot.diagnostics.FailureAnalyzer=\
      org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
      org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
      org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
      org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
      org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
      org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\
      org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer
      
      # Template availability providers
      org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
      org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
      org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
      org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
      org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
      org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider
      

      Chacun d'eux xxxAutoConfiguration Les classes sont toutes dans un conteneur Components,Tous dans le conteneur;Utilisez - les pour la configuration automatique;

  1. Chaque classe de configuration automatique effectue la fonction de configuration automatique;

  2. Nous avons**HttpEncodingAutoConfiguration(HttpConfiguration automatique du codage)**Expliquer le principe de la configuration automatique à titre d'exemple;

    image-20210926182951794

    //Indique qu'il s'agit d'une classe de configuration, Comme les profils écrits précédemment ,Vous pouvez également ajouter des composants au conteneur;
     @Configuration 
        
     //Démarrer la classe spécifiéeConfigurationPropertiesFonction;
     //Entrez iciHttpPropertiesVoir,Ajoutez les valeurs correspondantes dans le fichier de configuration àHttpPropertiesLier;
    //Et mettreHttpPropertiesAjouter àiocDans le récipient
     @EnableConfigurationProperties({
          HttpProperties.class}) 
        
     //SpringNiveau infé[email protected]
     // Juger selon des conditions différentes ,Si les conditions spécifiées sont remplies, La configuration dans toute la classe de configuration prend effet ;
     // Il s'agit ici de déterminer si l'application actuelle est webApplication,Si oui,La classe de configuration actuelle est en vigueur
     @ConditionalOnWebApplication(
        type = Type.SERVLET
     )
        
    //Déterminer si le projet actuel a cette classeCharacterEncodingFilter;SpringMVCFiltre pour la résolution de code aléatoire;
     @ConditionalOnClass({
          CharacterEncodingFilter.class})
        
     //Déterminer si une configuration existe dans le fichier de configuration:spring.http.encoding.enabled;
     //S'il n'existe pas,Le jugement est aussi valable
     //Même si notre profil n'est pas configurépring.http.encoding.enabled=true,Est également valide par défaut;
     @ConditionalOnProperty(
         prefix = "spring.http.encoding",
         value = {
          "enabled"},
        matchIfMissing = true
     )
        
     public class HttpEncodingAutoConfiguration {
          
         //Il est déjà en contact avecSpringBoot Le profil de 
         private final Encoding properties;
         //Dans le cas d'un seul constructeur de paramètres,La valeur du paramètre est prise du conteneur
         public HttpEncodingAutoConfiguration(HttpProperties properties) {
          
            this.properties = properties.getEncoding();
         }
        
         //Ajouter un composant au conteneur,Certaines valeurs de ce composant doivent être obtenues à partir depropertiesAccès moyen
         @Bean
         @ConditionalOnMissingBean //Déterminer si le conteneur n'a pas ce composant?
         public CharacterEncodingFilter characterEncodingFilter() {
          
             CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
             filter.setEncoding(this.properties.getCharset().name());
             filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
             filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
             return filter;
         }
         //.......
     }
    

Un mot pour résumer :À en juger par les différentes conditions actuelles,Déterminer si cette classe de configuration est valide!

  • Mais cette classe de configuration prend effet;Cette classe de configuration ajoutera divers composants au conteneur;

  • Les propriétés de ces composants sont dérivées depropertiesObtenu dans la classe,Chaque propriété de ces classes est liée au profil;

  • Toutes les propriétés qui peuvent être configurées dans le profil sontxxxxPropertiesLa classe contient;

  • Ce que le profil peut configurer peut se référer à cette classe d'attributs correspondant à une fonction

    //Obtient les valeurs spécifiées etbeanPour lier les propriétés
    @ConfigurationProperties(prefix = "spring.http") 
    public class HttpProperties {
          
        // .....
    }
    

Essayons le préfixe dans le fichier de configuration , Regarde le Conseil. !

1595493884773

C'est le principe de l'assemblage automatique !

Essence

  1. SpringBootLe démarrage charge un grand nombre de classes de configuration automatique

  2. Voyons si les fonctions dont nous avons besoinSpringBootDans la classe de configuration automatique écrite par défaut;

  3. Voyons encore quels composants sont configurés dans cette classe de configuration automatique;(Tant que les composants que nous utilisons existent,Nous n'avons plus besoin de configurer manuellement)

  4. Lorsque vous ajoutez des composants à une classe de configuration automatique dans un conteneur,Ça vient depropertiesLa version est - elle conforme aux exigences?Obtenir certaines propriétés dans la classe.Il suffit de spécifier les valeurs de ces propriétés dans le fichier de configuration;

    **xxxxAutoConfigurartion:Classe de configuration automatique;**Ajouter des composants au conteneur

    xxxxProperties:Aucune classe de configuration automatique ne correspond au succès;

@Conditional

Après avoir appris le principe de l'assemblage automatique , Concentrons - nous sur un détail ,La classe de configuration automatique doit être valide dans certaines conditions;

@ConditionalNotes dérivées(SpringVersion annotée [email protected]

Action:Ça doit l'ê[email protected] conditions spécifiées sont remplies,Il n'y a qu'une seule désignation dans le conteneur,Pour que la console imprime le rapport de configuration automatique;

@ConditionalAnnotation étendue Action(Configurer tout ce qui est à l'intérieur pour prendre effet)
@ConditionalOnJava SystèmejavaLa spécification n'existe pas dans le conteneur
@ConditionalOnJava La désignation existe dans le conteneurBean ;
@ConditionalOnMissingBean Il n'y a pas de classe spécifiée dans le systèmeBean ;
@ConditionalOnExpression SatisfactionSpELL'expression spécifie
@ConditionalOnClass Classe spécifiée dans le système
@ConditionalOnMissingClass Pour ajouter des composants au conteneur
@ConditionalOnSingleCandidate Tant que les composants que nous allons utiliser sontBean ,Ou celui - ciBeanEst le premier choixBean
@ConditionalOnProperty Si la propriété spécifiée dans le système a la valeur spécifiée
@ConditionalOnResource Existe - t - il un fichier de ressources spécifié sous le chemin de classe
@ConditionalOnWebApplication Actuellement, c'estwebEnvironnement
@ConditionalOnNotWebApplication Ce n'est paswebEnvironnement
@ConditionalOnJndi JNDIL'élément spécifié existe

Tant de classes de configuration automatique,Existe - t - il un fichier de ressources spécifié sous le chemin de classe;C'est - à - dire, Nous avons chargé tant de classes de configuration ,Mais tout ne marche pas..

Si la classe de configuration automatique est valide

Nous pouvonsapplication.propertiesEn activant debug=truePropriétés;

Imprimer le rapport de configuration automatique sur la console ,Afin que nous puissions facilement savoir quelles classes de configuration automatique sont en vigueur;

#OuvertspringbootClasse de débogage pour
debug=true 
  • Positive matches:(La classe de configuration automatique est activée:Correspondance positive)

  • Negative matches:(Pas de démarrage,Déterminer si les conditions actuellement spécifiées sont remplies:Correspondance négative)

  • Unconditional classes: (Classe inconditionnelle)

  • 【Présentation: Voir le journal de sortie 】

版权声明
本文为[Directeur d'usine Java]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/10/20211013211944094d.html

Scroll to Top