Springboot-starter personalizado escrito a mano, siente el encanto y el principio del marco

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 starterestá diseñado el sitio web oficial, ¡solo escriba uno como este!

Hicimos Ctrlclic <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>

CtrlHaga 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>

inserte la descripción de la imagen aquí

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

inserte la descripción de la imagen aquí
Ingrese el nombre general del proyecto
inserte la descripción de la imagen aquí
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! !

inserte la descripción de la imagen aquí

2. Crea un nuevo proyecto maven

inserte la descripción de la imagen aquí
Nombre del paquete y nombre:

inserte la descripción de la imagen aquí

3. Crea un nuevo proyecto springboot

inserte la descripción de la imagen aquí

4. Estructura del proyecto

¡Elimine todos los inútiles aquí! ! No se puede borrar
inserte la descripción de la imagen aquí

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>

inserte la descripción de la imagen aquí

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:

inserte la descripción de la imagen aquí

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-autoconfigureel 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 conditionagregar algunas anotaciones para completar beansi se debe agregar al contenedor:
Comúnmente utilizado:

  • @CondicionalEnClase
  • @ConditionalOnMissingClass
  • @CondicionalOnBean
  • @ConditionalOnMissingBean
  • @CondicionalEnPropiedad
    inserte la descripción de la imagen aquí

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! !

inserte la descripción de la imagen aquí

Si es springboot2.7 o superior:
nombre de carpeta: META-INF.spring
nombre de archivo:org.springframework.boot.autoconfigure.AutoConfiguration.imports

inserte la descripción de la imagen aquí
¡Solo escribe el nombre completo de la clase en él!

5. paquete

Primero spring-boot-autoconfigureempaqué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! !

inserte la descripción de la imagen aquí

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

inserte la descripción de la imagen aquí

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

inserte la descripción de la imagen aquí
El chino está distorsionado, tal vez no haya servlet, si lo entiende, deje un mensaje para decirme la solución, ¡gracias! !

inserte la descripción de la imagen aquí

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!

Supongo que te gusta

Origin blog.csdn.net/weixin_47367099/article/details/127458597
Recomendado
Clasificación