análisis de código fuente @SpringBootApplication

@SpringBootApplication contiene anotaciones

@Target (ElementType.TYPE) // especificar la posición jurídica comentarios por escrito donde 
@Retention (RetentionPolicy.RUNTIME) // Este RetentionPolicy constantes de enumeración que describen las estrategias de retención que se han enriquecido con el meta-anotación (@Retention ) para especificar el tiempo que desea mantener juntos el comentario 
@Documented // indicarlo por un comentario Javadoc registrado por defecto tiene una herramienta de registro similar. Si una declaración de tipo se anota documentado, que las notas se convierten en parte de la API pública. 
Indica clases anotadas @Inherited // heredan automáticamente 
@SpringBootConfiguration 
@EnableAutoConfiguration 
@ComponentScan (excludeFilters = {@filter (type = FilterType.CUSTOM, = TypeExcludeFilter clases. Clase ), el escáner // 
        @filter (tipo = el FilterType. PERSONAL, = clases AutoConfigurationExcludeFilter. clase )}) // escáner filtro

A, @ SpringBootConfiguration contiene notas

@Target (ElementType.TYPE) 
@Retention (RetentionPolicy.RUNTIME) 
@Documented 
@Configuration

  . @Configuration 1, lo que indica que la anotación es una clase de configuración, se puede utilizar para sustituir la anotación anterior @Configuration perfil spring.xml convencional;

            2, @ Configuración anotación clase se añade automáticamente al recipiente primavera.

 

Dos, @ EnableAutoConfiguration: la configuración automática de arranque primavera. (Convenio sobre la configuración)

@Target (ElementType.TYPE) 
@Retention (RetentionPolicy.RUNTIME) 
@Documented 
@Inherited 
@AutoConfigurationPackage 
@Import (AutoConfigurationImportSelector. Clase )

  @AutoConfigurationPackage: El paquete se pone en la exploración automática, que tiene una anotación

@Import (AutoConfigurationPackages.Registrar. Clase )

  El método de su aplicación:

estática  de clase Registrador implementos ImportBeanDefinitionRegistrar, DeterminableImports { 

        @ Override 
        públicos  vacíos registerBeanDefinitions (AnnotationMetadata metadatos, BeanDefinitionRegistry registro) { 
            registro (registro, nueva PackageImport (metadatos) .getPackageName ()); 
        } 

        @ Override 
        pública Set <Objeto> determineImports (AnnotationMetadata metadatos) {
             volver Collections.singleton ( nueva PackageImport (metadatos)); 
        } 

    }

  Los metadatos pueden adquirir clases @SpringBootApplication anotada, y luego pasar por el nombre del paquete de clase. Por este método la totalidad de la clase en el paquete y sus sub-paquetes contenida en el recipiente en la primavera, que es la razón por código de arranque del resorte debe ser colocado clases anotadas @SpringBootApplication o sub-paquete del paquete, con el fin de ser los contenedores de primavera la razón identificada.

 

  sí mismo en el que @EnableAutoConfiguration tiene una @Import (AutoConfigurationImportSelector.class), un método en el que:

@ Override
     públicos [] selectImports de Cuerda (AnnotationMetadata annotationMetadata) {
         si (! IsEnabled (annotationMetadata)) {
             retorno NO_IMPORTS; 
        } 
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader 
                .loadMetadata ( este .beanClassLoader); 
        AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry (autoConfigurationMetadata, 
                annotationMetadata); 
        retorno StringUtils.toStringArray (autoConfigurationEntry.getConfigurations ()); 
    }
protegida AutoConfigurationEntry getAutoConfigurationEntry (AutoConfigurationMetadata autoConfigurationMetadata, 
            AnnotationMetadata annotationMetadata) { 
        si (! isEnabled (annotationMetadata)) {
             retorno EMPTY_ENTRY; 
        } 
        Atributos AnnotationAttributes = getAttributes (annotationMetadata); 
        Lista <cadena> Configuraciones = getCandidateConfigurations (annotationMetadata, atributos); 
        configuraciones = RemoveDuplicates (configuraciones); 
        Set <cadena> exclusiones = getExclusions (annotationMetadata, atributos); 
        checkExcludedClasses (configuraciones, exclusiones);
        configurations.removeAll (exclusiones); 
        Configuraciones = filtro (configuraciones, autoConfigurationMetadata); 
        fireAutoConfigurationImportEvents (configuraciones, exclusiones); 
        volver  nueva AutoConfigurationEntry (configuraciones, exclusiones); 
    }

  DEBUG se puede encontrar configuraciones de la estructura de datos ListaEnlazada lista enlazada por terceros, es dependiente del frasco en paquetes, esta estructura permite supresiones cadena paquete frasco dependiente rápido.

  Lista <cadena> configuraciones = getCandidateConfigurations (annotationMetadata, atributos) es la forma de introducir el tarro paquete que?

  Introduzca getCandidateConfigurations:

protegidas Lista <cadena> getCandidateConfigurations (AnnotationMetadata metadatos, AnnotationAttributes atributos) { 
        Lista <String> configuraciones = SpringFactoriesLoader.loadFactoryNames (getSpringFactoriesLoaderFactoryClass (), 
                getBeanClassLoader ()); 
        Assert.notEmpty (configuraciones, "No hay clases de configuración de automóviles encuentran en META-INF / spring.factories Si." 
                + "Se utiliza un envase personalizado, asegúrese de que el archivo es correcto." );
        volver configuraciones; 
    }

  Proceder a SpringFactoriesLoader.loadFactoryNames:

pública  estática List <String> loadFactoryNames (<?> Clase factoryClass, @Nullable cargador de clases de cargador de clases) { 
        Cadena factoryClassName = factoryClass.getName ();
        retorno loadSpringFactories (cargador de clases) .getOrDefault (factoryClassName, Collections.emptyList ()); 
    }

  Proceder a loadSpringFactories:

privada  estática Map <String, lista <String >> loadSpringFactories (@Nullable cargador de clases de cargador de clases) { 
        MultiValueMap <String, String> resultado = cache.get (cargador de clases);
        si (! resultado = nula ) {
             retorno de resultado; 
        } 

        Tratar { 
            enumeración <URL> direcciones URL = (= cargador de clases! Nulo ? 
                    ClassLoader.getResources (FACTORIES_RESOURCE_LOCATION): 
                    ClassLoader.getSystemResources (FACTORIES_RESOURCE_LOCATION)); 
            resultar = nuevo LinkedMultiValueMap <>();
            mientras que (urls.hasMoreElements ()) { 
                URL url = urls.nextElement (); 
                Recursos UrlResource = nueva UrlResource (url); 
                Características = PropertiesLoaderUtils.loadProperties (de recursos);
                para (Map.Entry <?,?> entrada: properties.entrySet ()) { 
                    Cadena factoryClassName = . ((String) entry.getKey ()) trim ();
                    para (String factoryName: StringUtils.commaDelimitedListToStringArray ((String) entry.getValue ())) { 
                        result.add (factoryClassName, factoryName.trim ()); 
                    } 
                } 
            } 
            Cache.put (cargador de clases, resultado); 
            volver resultado; 
        } 
        Catch (IOException ex) {
             lanzar  nuevos IllegalArgumentException ( "No se puede fábricas de carga de un lugar [" + 
                    FACTORIES_RESOURCE_LOCATION + "]" , ex); 
        } 
    }

  Podemos ver claramente la clave FACTORIES_RESOURCE_LOCATION Esta enumeración es introducir paquete frasco, continúe entrando:

pública  estática  última cadena FACTORIES_RESOURCE_LOCATION = "META-INF / spring.factories";

  Tarro paquete finalmente encontrado por el fichero de configuración: primavera-boot-AUTOCONFIGURE-2.1.13.RELEASE.jar en el META-INF / spring.factories, para declarar, a continuación, utilizar para abrir por @EnableAutoConfiguration.

En tercer lugar, mirada en el principio específico de montaje automático

  En la primavera-boot-AUTOCONFIGURE-2.1.13.RELEASE.jar en el META-INF / spring.factories en org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration ejemplo, la información de anotación en la clase para ver cuales:

@Configuration // configuración identificada como una clase, para incorporar contenedores resorte 
@EnableConfigurationProperties (HttpProperties. Clase ) // entrar en la anotación, para encontrar el valor por defecto que codifica UTF_8 
@ConditionalOnWebApplication (tipo = ConditionalOnWebApplication.Type.SERVLET) // Si un servlet tal tipo de los de graduación 
@ConditionalOnClass (CharacterEncodingFilter. clase ) // filtro existe programas de código de bytes se establece 
@ConditionalOnProperty (prefijo = "spring.http.encoding", valor = "Habilitado", = matchIfMissing true ) // cuando cuando las propiedades que cumplen los requisitos, se cumple la condición
 pública  de clase HttpEncodingAutoConfiguration {... 
}

  3.1, 进入 @EnableConfigurationProperties (HttpProperties.class):

@ConfigurationProperties (prefijo = "spring.http")

/ **
* propiedades de configuración para http codificación.
* /

  Descubrimiento proporciona "" spring.http "" prefijo, comentarios, la codificación de la información, además de información de atributos juego de caracteres escritos a un application.properties en:

spring.http.encoding.charset = US_ASCII

  Se encontró que el acuerdo puede ser cambiado por este prefijo.

 

  3,2, 解读 @ConditionalOnProperty (prefijo = "spring.http.encoding", valor = "activado", matchIfMissing = true)

  prefijo = "spring.http.encoding", valor = "activar": 前缀 为 spring.http.encoding, 名为 habilitado;

  matchIfMissing: dijo atributos se establece cuando no hay corriente.

  Que no está configurado spring.http.encoding.enabled esta propiedad en application.properties, el efecto de clase.

 

  Resumen: es decir, cuando se cumplen las condiciones de anotación la clase de configuración automática @ConditionalOnXXXX, es decir, el efecto de montaje automático. Eso puede cambiar la clave @ConditionalOnProperty perfil de montaje automático global desde el valor del prefijo +.

  Datos adjuntos:

  

  consejo: Conjunto de depuración = true en el archivo de configuración global, el acceso rápido a la información se pueden montar de forma automática en la consola.

    Positiva coincide con una lista que muestra el arranque automático de la primavera abierta montaje;

    Lista de partidos negativo indica arranque automático del muelle del conjunto no está abierto.

Supongo que te gusta

Origin www.cnblogs.com/709539062rao/p/12605702.html
Recomendado
Clasificación