SpringBoot integrado de arranque es cómo construir una variedad de? fuente --SpringBoot (VI)

Nota: El análisis de código fuente se corresponde SpringBoot versión 2.1.0.RELEASE

1 Revisión de la vieja

Acceso Benpian valor de propiedad de configuración externa está ligada a cómo las propiedades de clase XxxProperties? fuente --SpringBoot (V)

La revisión de la vieja, Revisemos brevemente el contenido de los artículos, el que analiza SpringBoot valor de propiedad de configuración externa está ligada a la forma característica de la clase XxxProperties código fuente -relacionado, ahora un paso importante en el resumen de unión propiedad externa como sigue:

  1. El primero es el @EnableConfigurationPropertiescomentario importdel EnableConfigurationPropertiesImportSelectorpost procesador;
  2. EnableConfigurationPropertiesImportSelectorpostprocesador ED Springbuque está registrado ConfigurationPropertiesBeanRegistrary ConfigurationPropertiesBindingPostProcessorRegistrardos bean;
  3. En el que ConfigurationPropertiesBeanRegistrarel Springregistro de la embarcación XxxPropertiestipo bean; ConfigurationPropertiesBindingPostProcessorRegistrarel Springregistro del barco ConfigurationBeanFactoryMetadatay ConfigurationPropertiesBindingPostProcessordos post-procesador;
  4. ConfigurationBeanFactoryMetadatainicialización post procesador bean factorycuando el @Beanmetadatos anotación almacena para su uso en propiedades de unión posteriores lógica en la configuración externa asociada;
  5. ConfigurationPropertiesBindingPostProcessorvalor de atributo configuración externa postprocesador está ligado a la XxxPropertiespropiedad lógica encomendado ConfigurationPropertiesBinderel objeto, a continuación, ConfigurationPropertiesBinderel objeto y la propiedad lógica unión finalmente confiadas Binderal objeto a completa.

Visibles, es importante que el anterior paso 5 .

2 Introducción

Como todos sabemos, SpringBoot construyó una variedad de Starterpuesta en dependencia, que son muy fáciles de usar, lo que reduce en gran medida nuestro trabajo de desarrollo. Con el Starterinicio dependiente, no tenemos que considerar lo que este proyecto necesita la biblioteca, esta biblioteca groupIdy artifactIdlo que es? No hay que preocuparse acerca de la introducción de esta versión de la biblioteca no tendrá ningún conflicto con otras dependencias.

Para el castaño : Ahora queremos desarrollar un proyecto web, siempre y cuando la introducción de spring-boot-starter-webla partida confiar en ella, sin tener en cuenta la introducción de las cuales dependen de la versión de la. Al igual que antes, tenemos que considerar lo introdujo dependencias, tales como la introducción spring-weby spring-webmvcla dependencia; Además, considerar la versión de la introducción de estas bibliotecas no entrará en conflicto con otras bibliotecas.

Así que no analizamos la SpringBoot código fuente configurada de forma automática la actualidad, debido a la relación comenzó con la configuración automática depende de la mano de relación van de la mano, por lo Benpian primer pie en la perspectiva proyecto Maven para construir que suelen utilizar los análisis macro SpringBoot incorporado en la variedad Starteres cómo construir?

dependiente de transferencia de etiquetas opcional 3 Maven

En el análisis de diversos SpringBoot construida Starterantes de principio de construcción, debemos primero saber Maven bajo la optionaletiqueta, ya que la etiqueta juega un papel crucial.
Maven la optionaletiqueta indica medios de suministro opcionales dependientes es decir, no directamente siguientes dan castaña se describirán.

Por ejemplo, hay A, By Ctres bibliotecas, Cdependientes B, Bdependientes A. He aquí un vistazo a las tres de la biblioteca pom.xmlde archivos:

// A的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <groupId>com.ymbj</groupId>
        <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <groupId>com.ymbj</groupId>
        <artifactId>B</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--注意是可选依赖-->
    <dependencies>
        <dependency>
            <groupId>com.ymbj</groupId>
            <artifactId>A</artifactId>
            <version>1.0-SNAPSHOT</version>
        <optional>true</optional>
        </dependency>
    </dependencies>

</project>

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <groupId>com.ymbj</groupId>
        <artifactId>C</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.ymbj</groupId>
            <artifactId>B</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

Tres por encima A, By una Cbiblioteca de pom.xmlprogramas, Bdependencias de la biblioteca Ade la biblioteca, a continuación, Cla biblioteca a su vez depende de la Bbiblioteca, por favor, piense, Maven paquete para construir Cla biblioteca, Ala biblioteca no se ha introducido a?

La respuesta es, sin duda ninguna , porque la Bbiblioteca de importación Autilizando la biblioteca se basa &lt;optional&gt;true&lt;/optional&gt;, está a punto de Maven optionaletiqueta se establece en un valor true, entonces Cla biblioteca re-introdujo Bcuando las dependencias de bibliotecas, Ano se introducirán las bibliotecas de la Cbiblioteca.

Al mismo tiempo hay un dependencias transitivas con Maven relacionada exclusionsetiqueta, esto representaría un niño a las dependencias de bibliotecas excluidos, no se describe en detalle aquí.

4 SpringBoot incorporado arranque es cómo construir una variedad de?

Ahora exploramos diferentes SpringBoot construida Starteral final es cómo construirlo?

Recuerde cómo analizar módulo y estructura de la fuente SpringBoot? La relación entre el interior del análisis SpringBoot módulo de este post? En primer vistazo al código fuente SpringBoot diagrama de bloques interno:

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 1 </ center>

Todos sabemos, SpringBoot Starterdel principio de construcción esencia se configura automáticamente, y por lo tanto se puede ver desde la Figura 1 proyectos de código SpringBoot internos con Startersu configuración automática tiene cuatro módulos relacionados: spring-boot-starters, spring-boot-actuator-autoconfigure, spring-boot-autoconfigurey spring-boot-test-autoconfigure. Mira el papel de cada módulo de cómo analizar módulo de origen SpringBoot y la estructura? El artículo, no los repita aquí.

Por lo tanto, spring-boot-startersel módulo configura automáticamente con la parte posterior de tres módulos relacionados xxx-autoconfiguremódulo relación de lo que es?

En este punto, echamos un vistazo spring-boot-startersen el interior del módulo ¿Cuál es la estructura?

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 2 </ center>

2 puede verse en la figura spring-boot-startersmódulo contiene varios SpringBoot de edificio starter: spring-boot-starter-xxx. Debido a una variedad de SpringBoot incorporado startertambién, con nuestro habitual spring-boot-starter-webde inicio para explorar basan buena.

Lo primero que mira en spring-boot-starter-webla estructura interna del módulo:

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 3 </ center>

Se puede ver spring-boot-starter-webel interior del módulo sólo .flattened-pom.xmly pom.xmldocumentos, sin ningún código ! Un poco más allá de lo que esperábamos. Todos sabemos cuándo utilizar SpringBoot introducción de artículos en la Web spring-boot-starter-webempezar a confiar, y ahora el spring-boot-starter-webmódulo no hay una sola línea de código, entonces spring-boot-starter-webexactamente cómo construirla? Ahora se muestra en la Figura 1 spring-boot-autoconfigureen el módulo de configuración automática?

En este punto, tenemos que mirar a spring-boot-starter-weblos módulos pom.xmlcontenidos del archivo:

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 4 </ center>

Se puede observar en la Figura 4, spring-boot-starter-webla dependencia del módulo de spring-boot-starter, spring-boot-starter-tomcat, spring-weby spring-webmvcotros módulos, en realidad no dependiente spring-boot-autoconfiguremódulo de configuración automática!

Dado que el spring-boot-starter-webmódulo que ver con el spring-boot-autoconfiguremódulo de configuración automática relacionados, por lo que el spring-boot-starter-webmódulo debe ser indirectamente dependientes del spring-boot-autoconfiguremódulo de configuración automática.

Figura 4 marcado marcado "enfoque" del spring-boot-startermódulo es que la mayor spring-boot-starter-xxxbase de módulo en el que el módulo es el núcleo Starter, incluyendo la configuración automática, la tala y YAMLapoyo. En este punto hay que prestar atención en spring-boot-starterel pom.xmlarchivo, tal vez depende de la del spring-boot-autoconfiguremódulo de configuración automática.

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 5 </ center>

Se puede ver en la Figura 5, en frente de nosotros sospechamos que no está mal, es spring-boot-starterel módulo depende del spring-boot-autoconfiguremódulo de configuración automática! Por lo tanto, el aquí podemos concluir: el spring-boot-starter-webmódulo hay un código, sino por spring-boot-startermódulo indirectamente dependiente del spring-boot-autoconfiguremódulo de configuración automática, con el fin de lograr su función dependiente de inicio.

En este momento, nos fijamos en spring-boot-autoconfigurela estructura interna de la configuración automática del paquete del módulo:

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 6 </ center>

La figura 6 por el cuadro rojo, podemos conocer el spring-boot-starter-webinicio de la función dependiente de la configuración automática originalmente por el spring-boot-autoconfiguremódulo de webclase que implementa el paquete.

Aquí para spring-boot-starter-webiniciar la construcción de los principios básicos de los que dependemos clara, pero hay un punto clave especialmente importante que no hemos de encontrar. El punto clave con Maven de optionaletiquetar algunos efectos.

Para llegar al punto, vamos a pensar en un problema: Por lo general, desarrollamos webPor qué el proyecto fue introducido spring-boot-starter-webdespués de la dependencia de inicio spring-boot-autoconfiguredel módulo webasociado con la clase de configuración automática empezará a reproducirse en el trabajo?

Debemos saber que un trabajo de clase de configuración automática es a menudo debido a classpathla existencia de una clase, para DispatcherServletAutoConfigurationesta clase configurado automáticamente como un punto de entrada para obtener el punto mejor.
Mire bajo DispatcherServletAutoConfigurationcondiciones capaces de configuración automática es válida?

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 7 </ center>

Se muestra en la Fig. 7, DispatcherServletAutoConfigurationuna de las condiciones que se pueden configurar de forma automática @ConditionalOnClass(DispatcherServlet.class), que sólo classpathexiste en DispatcherServlet.classla clase, entonces DispatcherServletAutoConfigurationla lógica de configuración automática para el trabajo.

Y DispatcherServletesta clase es spring-webmvcla biblioteca de la dependencia, como se muestra a continuación:

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 8 </ center>

En este punto nos fijamos en spring-boot-autoconfigureel módulo de pom.xmlarchivo para introducir spring-webmvcla situación dependiente-:

SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
<Center> 图 9 </ center>

Se muestra en la Fig. 9, spring-boot-autoconfigureel módulo introduce spring-webmvccuando esta dependencia optionalse establece true, el original es opcional dependiente. Es decir, spring-webmvcesta biblioteca dependerá se introduce en spring-boot-autoconfigureel módulo, en lugar de ser introducido en forma indirecta depende spring-boot-autoconfiguremódulo de spring-boot-starter-webla dependencia de inicio.

En este punto, veamos spring-boot-starter-webla pom.xmldependencia de la documentación:
SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)
. <Centro> La figura 10 </ center>

Como se muestra en la Fig. 10, spring-boot-starter-webla dependencia inicial explícitamente introduce spring-webmvclas dependencias, es decir, la introducción de spring-webmvcningún momento optionaletiqueta, y porque DispatcherServletes en esta clase spring-webmvc, de modo que las dependencias de classpathla presencia de DispatcherServletesta clase, DispatcherServletAutoConfigurationesta clase entrarán en vigor configura automáticamente. Por supuesto, weben relación con otra clase de configuración automática es para tener efecto este principio.

En este punto, también entendemos spring-boot-autoconfigurepor qué el módulo debe introdujo spring-webmvcesta dependencia como dependencias opcionales, y su finalidad es la spring-boot-starter-webdependencia energética introducido explícitamente iniciar spring-webmvcesta dependencia (esto juegan un papel decisivo), por lo que hemos desarrollado proyectos web, siempre y cuando la introducción de spring-boot-starter-webinicio la dependencia, a continuación, las clases relacionadas con la web de configure automáticamente entrarán en vigor, por lo que fuera de la caja este es el spring-boot-starter-webprincipio de construcción del comienzo de un dependiente.

Se mencionó anteriormente spring-boot-starter-actuator, spring-boot-starter-testy otra incorporado spring-boot-starter-xxxen principio, la construcción comenzó basa también, pero spring-boot-starter-actuatorconfía spring-boot-actuator-autoconfigure, spring-boot-starter-testconfía spring-boot-test-autoconfigurerellenos módulo no elaboran.

Pensamientos : spring-boot-actuator-autoconfigureEl pom.xmldocumento fue presentado más de 20 dependencia opcional, y por qué el spring-boot-starter-actuatorinicio sólo se basan introdujeron micrometer-coreesta dependencia es?

5 SpringBoot imitan una estructura de paquete personalizado de arranque

SpringBoot análisis previo de los distintos incorporado Starterla construcción de principios, la teoría con la práctica, por lo que si podemos practicar práctica vistazo a la costumbre Startertanto mejor.

A continuación se proporciona una costumbre Starterde un simple Demo, esta Demototalmente imitan SpringBootel incorporado en la Starterestructura interna del paquete para escribir, aprender más sobre SpringBoot construido para diversas Starterconstrucción principio útil.

Aquí está la Demodirección de la github y lo recomiendo a los pequeños socios que estén interesados.
Springboot imitan la estructura interna de una costumbre de arranque . Además, la forma de personalizar una Starter, mybatis puede hacer referencia a la primavera-arranque-motor de arranque lo que está escrito.

6 Resumen

Bueno, SpringBoot construida en varios Starterprincipios de construcción de análisis para este fin, hace un resumen de los puntos clave:

  1. spring-boot-starter-xxxPartiendo ningún código dependiente, pero directa o indirectamente dependientes del xxx-autoconfiguremódulo, el xxx-autoconfiguremódulo toma la spring-boot-starter-xxxrealización de la configuración automática del inicio dependiente;
  2. xxx-autoconfiguremódulo de configuración automática introduce algunas dependencias opcionales, estas dependencias no se transmiten al opcional spring-boot-starter-xxxdependencia de inicio, que se construye a partir dependiente de clave ;
  3. spring-boot-starter-xxxInicio dependencia explícita presenta cierta dependencia de la función de configuración automática opcional;
  4. Tras el paso por encima de 3-preparado, empezamos el proyecto, siempre y cuando la introducción de un dependiente, puede utilizar fuera de la caja, sin tener que crear manualmente un poco beany así sucesivamente.

El original no es fácil, ayudar a señalar un canto alabanza!

Como el autor se limita, si hay un error en el texto y además indicar, gracias.

Referencia:
. 1, Maven dependiente profundo entendimiento transitiva


[Fuente] atención de bienvenida a las notas número público, junto con el intercambio de aprendizaje.
SpringBoot integrado de arranque es cómo construir una variedad de?  fuente --SpringBoot (VI)

Supongo que te gusta

Origin blog.51cto.com/14747176/2478625
Recomendado
Clasificación