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:
- El primero es el
@EnableConfigurationProperties
comentarioimport
delEnableConfigurationPropertiesImportSelector
post procesador; EnableConfigurationPropertiesImportSelector
postprocesador EDSpring
buque está registradoConfigurationPropertiesBeanRegistrar
yConfigurationPropertiesBindingPostProcessorRegistrar
dosbean
;- En el que
ConfigurationPropertiesBeanRegistrar
elSpring
registro de la embarcaciónXxxProperties
tipobean
;ConfigurationPropertiesBindingPostProcessorRegistrar
elSpring
registro del barcoConfigurationBeanFactoryMetadata
yConfigurationPropertiesBindingPostProcessor
dos post-procesador; ConfigurationBeanFactoryMetadata
inicialización post procesadorbean
factory
cuando el@Bean
metadatos anotación almacena para su uso en propiedades de unión posteriores lógica en la configuración externa asociada;ConfigurationPropertiesBindingPostProcessor
valor de atributo configuración externa postprocesador está ligado a laXxxProperties
propiedad lógica encomendadoConfigurationPropertiesBinder
el objeto, a continuación,ConfigurationPropertiesBinder
el objeto y la propiedad lógica unión finalmente confiadasBinder
al objeto a completa.
Visibles, es importante que el anterior paso 5 .
2 Introducción
Como todos sabemos, SpringBoot construyó una variedad de Starter
puesta en dependencia, que son muy fáciles de usar, lo que reduce en gran medida nuestro trabajo de desarrollo. Con el Starter
inicio dependiente, no tenemos que considerar lo que este proyecto necesita la biblioteca, esta biblioteca groupId
y artifactId
lo 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-web
la 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ónspring-web
yspring-webmvc
la 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 Starter
es cómo construir?
dependiente de transferencia de etiquetas opcional 3 Maven
En el análisis de diversos SpringBoot construida Starter
antes de principio de construcción, debemos primero saber Maven bajo la optional
etiqueta, ya que la etiqueta juega un papel crucial.
Maven la optional
etiqueta indica medios de suministro opcionales dependientes es decir, no directamente siguientes dan castaña se describirán.
Por ejemplo, hay A
, B
y C
tres bibliotecas, C
dependientes B
, B
dependientes A
. He aquí un vistazo a las tres de la biblioteca pom.xml
de 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
, B
y una C
biblioteca de pom.xml
programas, B
dependencias de la biblioteca A
de la biblioteca, a continuación, C
la biblioteca a su vez depende de la B
biblioteca, por favor, piense, Maven paquete para construir C
la biblioteca, A
la biblioteca no se ha introducido a?
La respuesta es, sin duda ninguna , porque la B
biblioteca de importación A
utilizando la biblioteca se basa <optional>true</optional>
, está a punto de Maven optional
etiqueta se establece en un valor true
, entonces C
la biblioteca re-introdujo B
cuando las dependencias de bibliotecas, A
no se introducirán las bibliotecas de la C
biblioteca.
Al mismo tiempo hay un dependencias transitivas con Maven relacionada exclusions
etiqueta, 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 Starter
al 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:
<Center> 图 1 </ center>
Todos sabemos, SpringBoot Starter
del 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 Starter
su configuración automática tiene cuatro módulos relacionados: spring-boot-starters
, spring-boot-actuator-autoconfigure
, spring-boot-autoconfigure
y 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-starters
el módulo configura automáticamente con la parte posterior de tres módulos relacionados xxx-autoconfigure
módulo relación de lo que es?
En este punto, echamos un vistazo spring-boot-starters
en el interior del módulo ¿Cuál es la estructura?
<Center> 图 2 </ center>
2 puede verse en la figura spring-boot-starters
módulo contiene varios SpringBoot de edificio starter
: spring-boot-starter-xxx
. Debido a una variedad de SpringBoot incorporado starter
también, con nuestro habitual spring-boot-starter-web
de inicio para explorar basan buena.
Lo primero que mira en spring-boot-starter-web
la estructura interna del módulo:
<Center> 图 3 </ center>
Se puede ver spring-boot-starter-web
el interior del módulo sólo .flattened-pom.xml
y pom.xml
documentos, 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-web
empezar a confiar, y ahora el spring-boot-starter-web
módulo no hay una sola línea de código, entonces spring-boot-starter-web
exactamente cómo construirla? Ahora se muestra en la Figura 1 spring-boot-autoconfigure
en el módulo de configuración automática?
En este punto, tenemos que mirar a spring-boot-starter-web
los módulos pom.xml
contenidos del archivo:
<Center> 图 4 </ center>
Se puede observar en la Figura 4, spring-boot-starter-web
la dependencia del módulo de spring-boot-starter
, spring-boot-starter-tomcat
, spring-web
y spring-webmvc
otros módulos, en realidad no dependiente spring-boot-autoconfigure
módulo de configuración automática!
Dado que el spring-boot-starter-web
módulo que ver con el spring-boot-autoconfigure
módulo de configuración automática relacionados, por lo que el spring-boot-starter-web
módulo debe ser indirectamente dependientes del spring-boot-autoconfigure
módulo de configuración automática.
Figura 4 marcado marcado "enfoque" del spring-boot-starter
módulo es que la mayor spring-boot-starter-xxx
base de módulo en el que el módulo es el núcleo Starter
, incluyendo la configuración automática, la tala y YAML
apoyo. En este punto hay que prestar atención en spring-boot-starter
el pom.xml
archivo, tal vez depende de la del spring-boot-autoconfigure
módulo de configuración automática.
<Center> 图 5 </ center>
Se puede ver en la Figura 5, en frente de nosotros sospechamos que no está mal, es spring-boot-starter
el módulo depende del spring-boot-autoconfigure
módulo de configuración automática! Por lo tanto, el aquí podemos concluir: el spring-boot-starter-web
módulo hay un código, sino por spring-boot-starter
módulo indirectamente dependiente del spring-boot-autoconfigure
mó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-autoconfigure
la estructura interna de la configuración automática del paquete del módulo:
<Center> 图 6 </ center>
La figura 6 por el cuadro rojo, podemos conocer el spring-boot-starter-web
inicio de la función dependiente de la configuración automática originalmente por el spring-boot-autoconfigure
módulo de web
clase que implementa el paquete.
Aquí para spring-boot-starter-web
iniciar 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 optional
etiquetar algunos efectos.
Para llegar al punto, vamos a pensar en un problema: Por lo general, desarrollamos web
Por qué el proyecto fue introducido spring-boot-starter-web
después de la dependencia de inicio spring-boot-autoconfigure
del módulo web
asociado 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 classpath
la existencia de una clase, para DispatcherServletAutoConfiguration
esta clase configurado automáticamente como un punto de entrada para obtener el punto mejor.
Mire bajo DispatcherServletAutoConfiguration
condiciones capaces de configuración automática es válida?
<Center> 图 7 </ center>
Se muestra en la Fig. 7, DispatcherServletAutoConfiguration
una de las condiciones que se pueden configurar de forma automática @ConditionalOnClass(DispatcherServlet.class)
, que sólo classpath
existe en DispatcherServlet.class
la clase, entonces DispatcherServletAutoConfiguration
la lógica de configuración automática para el trabajo.
Y DispatcherServlet
esta clase es spring-webmvc
la biblioteca de la dependencia, como se muestra a continuación:
<Center> 图 8 </ center>
En este punto nos fijamos en spring-boot-autoconfigure
el módulo de pom.xml
archivo para introducir spring-webmvc
la situación dependiente-:
<Center> 图 9 </ center>
Se muestra en la Fig. 9, spring-boot-autoconfigure
el módulo introduce spring-webmvc
cuando esta dependencia optional
se establece true
, el original es opcional dependiente. Es decir, spring-webmvc
esta biblioteca dependerá se introduce en spring-boot-autoconfigure
el módulo, en lugar de ser introducido en forma indirecta depende spring-boot-autoconfigure
módulo de spring-boot-starter-web
la dependencia de inicio.
En este punto, veamos spring-boot-starter-web
la pom.xml
dependencia de la documentación:
. <Centro> La figura 10 </ center>
Como se muestra en la Fig. 10, spring-boot-starter-web
la dependencia inicial explícitamente introduce spring-webmvc
las dependencias, es decir, la introducción de spring-webmvc
ningún momento optional
etiqueta, y porque DispatcherServlet
es en esta clase spring-webmvc
, de modo que las dependencias de classpath
la presencia de DispatcherServlet
esta clase, DispatcherServletAutoConfiguration
esta clase entrarán en vigor configura automáticamente. Por supuesto, web
en relación con otra clase de configuración automática es para tener efecto este principio.
En este punto, también entendemos spring-boot-autoconfigure
por qué el módulo debe introdujo spring-webmvc
esta dependencia como dependencias opcionales, y su finalidad es la spring-boot-starter-web
dependencia energética introducido explícitamente iniciar spring-webmvc
esta dependencia (esto juegan un papel decisivo), por lo que hemos desarrollado proyectos web, siempre y cuando la introducción de spring-boot-starter-web
inicio 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-web
principio de construcción del comienzo de un dependiente.
Se mencionó anteriormente spring-boot-starter-actuator
, spring-boot-starter-test
y otra incorporado spring-boot-starter-xxx
en principio, la construcción comenzó basa también, pero spring-boot-starter-actuator
confía spring-boot-actuator-autoconfigure
, spring-boot-starter-test
confía spring-boot-test-autoconfigure
rellenos módulo no elaboran.
Pensamientos :
spring-boot-actuator-autoconfigure
Elpom.xml
documento fue presentado más de 20 dependencia opcional, y por qué elspring-boot-starter-actuator
inicio sólo se basan introdujeronmicrometer-core
esta dependencia es?
5 SpringBoot imitan una estructura de paquete personalizado de arranque
SpringBoot análisis previo de los distintos incorporado Starter
la construcción de principios, la teoría con la práctica, por lo que si podemos practicar práctica vistazo a la costumbre Starter
tanto mejor.
A continuación se proporciona una costumbre Starter
de un simple Demo
, esta Demo
totalmente imitan SpringBoot
el incorporado en la Starter
estructura interna del paquete para escribir, aprender más sobre SpringBoot construido para diversas Starter
construcción principio útil.
Aquí está la Demo
direcció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 Starter
principios de construcción de análisis para este fin, hace un resumen de los puntos clave:
spring-boot-starter-xxx
Partiendo ningún código dependiente, pero directa o indirectamente dependientes delxxx-autoconfigure
módulo, elxxx-autoconfigure
módulo toma laspring-boot-starter-xxx
realización de la configuración automática del inicio dependiente;xxx-autoconfigure
módulo de configuración automática introduce algunas dependencias opcionales, estas dependencias no se transmiten al opcionalspring-boot-starter-xxx
dependencia de inicio, que se construye a partir dependiente de clave ;spring-boot-starter-xxx
Inicio dependencia explícita presenta cierta dependencia de la función de configuración automática opcional;- 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
bean
y 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.