I. Introducción
El principio de configuración automática de Springboot a menudo se pregunta en las entrevistas, y no puedo recordarlo incluso después de leerlo. Es mejor escribir un inicio a mano para profundizar mi memoria.
Después de leerlo, descubrí que la mayoría de los iniciadores se basan en este principio y la práctica será memorable.
Idea central: 约定大于配置
.
2. Estudio preliminar sobre el principio de arranque de arranque.
Echemos un vistazo a cómo starter
está diseñado el sitio web oficial, ¡solo escriba uno como este!
Hicimos Ctrl
clic <artifactId>spring-boot-starter-web</artifactId>
para ingresar al pom interno y encontramos que hay un
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.3</version>
<scope>compile</scope>
</dependency>
Ctrl
Haga clic aquí <artifactId>spring-boot-starter</artifactId>
para ingresar el pom interno del iniciador:
encontramos que esta dependencia del paquete es lo que haremos más adelante:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.3</version>
<scope>compile</scope>
</dependency>
Ahora podemos crear dos proyectos:
- resorte-arranque-arrancador (motor de arranque)
- spring-boot-starter-autoconfigure (paquete de configuración automática)
El editor vio el recordatorio escrito por el funcionario, puede nombrarlo de acuerdo con el sitio web oficial, ¡no aprenda del editor! !
Debe asegurarse de proporcionar un espacio de nombres apropiado para su lanzador. No inicie el nombre del módulo spring-boot con .incluso si usa un ID de grupo de Maven diferente. Es posible que brindemos soporte oficial para su contenido configurado automáticamente en el futuro.
Como regla general, debe nombrar sus módulos compuestos después del habilitador. Por ejemplo, suponga que está creando un iniciador para "acme" y nombra el módulo de configuración automática acme-spring-boot y el iniciador acme-spring-boot-starter. Si solo tiene un módulo que combina los dos, asígnele el nombre acme-spring-boot-starter.
3. Construcción del proyecto
1. Crea un nuevo proyecto en blanco
Ingrese el nombre general del proyecto
y cree dos nuevos en el proyecto en blanco, que se pueden crear por separado aquí. El editor aquí es el mismo que Raytheon, ¡así que no crearemos proyectos separados! !
2. Crea un nuevo proyecto maven
Nombre del paquete y nombre:
3. Crea un nuevo proyecto springboot
4. Estructura del proyecto
¡Elimine todos los inútiles aquí! ! No se puede borrar
4. Configuración
1. Introduzca sus propias dependencias de configuración automática en el proyecto de inicio
Es el escenario de la construcción del proyecto anterior.
<dependencies>
<dependency>
<groupId>com.wang</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
2. Configuración pom spring-boot-autoconfigure
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
O borre las cosas inútiles, el resto es como sigue:
Cinco, escribir proyecto de autoconfiguración
1. Configurar un frijol
Primero elimine la clase de inicio automático, no la necesitamos, cree un nuevo bean
en spring-boot-autoconfigure
el proyecto y no es necesario que este bean esté en el contenedor en este momento, escribimos una autoconfiguración para permitir que se agregue automáticamente al contenedor.
Esta es la idea de la configuración automática
/**
* 这里不需要让在容器中,我们写一个自己配置,让他自动加入到容器中
* @author wangzhenjun
* @date 2022/10/14 16:26
*/
public class HelloService {
@Autowired
private MyProperties myProperties;
public String HelloWord (String username){
return myProperties.getPrefix() + username + myProperties.getSuffix();
}
}
2. Escriba un archivo de configuración
Aquí, para obtener los valores de los atributos en el archivo de configuración, la mayor parte del código fuente de configuración automática de springboot se escribe en un archivo de configuración, ¡y otros se pueden obtener de acuerdo con el principio 属性和值
! !
/**
* @author wangzhenjun
* @date 2022/10/14 16:28
*/
@Data
@ConfigurationProperties("wang.name")
public class MyProperties {
private String prefix;
private String suffix;
}
3. Escribir configuración automática
import com.wang.springbootautoconfigure.properties.MyProperties;
import com.wang.springbootautoconfigure.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author wangzhenjun
* @date 2022/10/14 16:33
*/
@Configuration
//没有这个bean的时候才会生效
@ConditionalOnMissingBean(HelloService.class)
// 加载配置文件,让它成为容器中的bean
@EnableConfigurationProperties(MyProperties.class)
public class ServiceAutoConfiguration {
/**
* 把刚刚写的服务,加入到容器中
*/
@Bean
public HelloService helloService (){
return new HelloService();
}
}
Lo principal es condition
agregar algunas anotaciones para completar bean
si se debe agregar al contenedor:
Comúnmente utilizado:
- @CondicionalEnClase
- @ConditionalOnMissingClass
- @CondicionalOnBean
- @ConditionalOnMissingBean
- @CondicionalEnPropiedad
4. Nueva primavera.fábricas
Vemos que la configuración automática en el código fuente es obtener y cargar desde este archivo, así que lo imitamos y creamos uno nuevo, ¡para que podamos escanearlo y agregarlo al contenedor! !
Si es springboot2.7 o superior:
nombre de carpeta: META-INF.spring
nombre de archivo:org.springframework.boot.autoconfigure.AutoConfiguration.imports
¡Solo escribe el nombre completo de la clase en él!
5. paquete
Primero spring-boot-autoconfigure
empaquételo en la biblioteca local y luego empaquételo spring-boot-starter
, el pedido debe estar allí, de lo contrario, ¡no se puede encontrar el paquete anterior! !
6. prueba
¡Estamos probando un nuevo proyecto, y el editor del nuevo proyecto no lo llevará a construirlo!
1. Importa nuestras dependencias iniciales
<dependency>
<groupId>com.wang</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2. Agregar archivo de configuración
wang:
name:
prefix: hello
suffix: 886
3. Cree una nueva clase de prueba de controlador
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private HelloService helloService;
@GetMapping("/starter")
public String starter(){
return helloService.HelloWord("tom");
}
}
4. Prueba de acceso
La visita fue exitosa, pero hay caracteres ilegibles en chino. No puedo encontrar una solución. Si lo entiende, ¡deje un mensaje para informarme! !
Una vez que se borra el proceso principal, puede comprender lentamente el encanto de la configuración automática.
El proceso general debería ser así:
Introducir starter --- xxxAutoConfiguration --- poner componentes en el contenedor ---- enlazar xxxProperties ---- elementos de configuración
El chino está distorsionado, tal vez no haya servlet, si lo entiende, deje un mensaje para decirme la solución, ¡gracias! !
7. Resumen
¡Una vez que lo veas, lo perderás una vez que lo hagas! Todos todavía tienen que hacer su propia práctica, no seas demasiado altivo, para que ganes algo, ¡es solo eso 约定大于配置+SPI发现机制
!
También hay algunas anotaciones que a menudo aparecen en el código fuente, ¡usted mismo puede escribir el inicio después de recordarlo!