Comprender la anotación dos de Java

Escribí la primera nota sobre la comprensión de Java, pero supongo que a todos no les importará demasiado: ¿No son solo algunos conceptos de anotaciones? Sin embargo, sigo sintiendo que la base es muy importante. Cuando comencé a comprender las anotaciones, estaba desconcertado: simplemente escriba el nombre de una anotación y el código sabrá lo que quiere hacer. ¡Piense en ello como inteligencia artificial! Luego les pregunté a los otros amigos, ellos también estaban medio informados y perdidos. Más tarde, fui a ver las explicaciones y lentamente adiviné un poco.

Una anotación, que parece alta, puede realizar verificación de parámetros, conversión de datos, procesamiento de métodos, procesamiento de filtrado, etc., de hecho, simplemente se implementa silenciosamente en segundo plano a través de la reflexión, y estos códigos son realmente un procesamiento lógico sin nombre.

Si ha utilizado el framework java durante un período de tiempo, estará más o menos expuesto al uso de anotaciones y estará familiarizado con los efectos de algunas anotaciones. Tal vez más personas estén usando Spring Family Bucket, @ RestController, @ ResponseBody, @ RequestBody, @ Autowired, @ Resource, @ RequestParam, @ Service, @ Component, @ Repository, @ Mapper, @ Configuration, todos están muy familiarizados con It's también muy conveniente.

Sin embargo, no entiendo muy bien el principio. Incluso si abro estos comentarios, puede ser un gran lío. No me molesto en leerlo. Es realmente un dolor de cabeza leer estas cosas precipitadamente. No puedo explicar esto claramente. Hablaré de ello hoy. Para comenzar, si está interesado en el seguimiento, puede ver el análisis en profundidad del código fuente de Spring para comprender la implementación de estas anotaciones.

Me gustaría mencionar aquí que algunos novatos pueden cometer tales errores.

@RestController("/demo")
public class DemoController {

    @PostMapping("test")
    public DefaultResponse getInfoList(@RequestBody RequestVo requestVo){
        return  null;
    }
}
@Data
public class RequestVo {

    private  String uuid ;

    private Integer minAge;

    private String maxAge;

    // 学校id必须不为空

    @NotNull(message = "学校id不能为空")
    private String schoolId;

}

Como puede ver, este es un proceso simple de recepción de solicitudes de Spring que no puede ser más simple. El parámetro de entrada json se convierte directamente al objeto RequestVo a través de @RequestBody, y la verificación schoolId no puede ser nula se agrega al mismo tiempo.

Por supuesto, mis amigos cuidadosos han descubierto que, de hecho, esta verificación @NotNull (mensaje = "La identificación de la escuela no puede estar vacía") no funciona. La razón es simple. Como dije antes, las anotaciones no son inteligencia artificial y no pueden ser identificados por ellos mismos., Y este @NotNull no está combinado con @RequestBody, y no está directamente incrustado en Spring, por lo que es imposible verificarlo automáticamente. No sé si alguno de mis amigos se ha encontrado con este tipo de problema. Me preguntaba cuándo surgió el error en la prueba, pero es realmente difícil de averiguar sin una prueba cuidadosa. Jaja, ajusta la atmósfera.

De hecho, cuando abre este @NotNull, puede encontrar que su uso se combina con otra anotación, que es @Valid. Solo escribiendo de esta manera se puede hacer realmente la verificación nula.

   @PostMapping("test")
    public DefaultResponse getInfoList(@Valid @RequestBody RequestVo requestVo){
        return  null;
    }

Por supuesto, esta encapsulación de @Valid es muy clásica.Si se solicita la misma interfaz varias veces, se pueden implementar diferentes reglas de filtrado según sea necesario.Si está interesado, puede verificarlo ~ (principalmente en el procesamiento de definición de grupo en @NotNull )

Estiró un poco lejos y comenzó a ir al grano.

Escriba una anotación simple a continuación para obtenerla.

Color de anotación:

package com.example.annotion;

import java.lang.annotation.*;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Color {
    String value();
}

Esta es una anotación muy común, es decir, el color, el valor indica el valor del color.

Fruta Manzana, la fruta naturalmente tiene un color, por ejemplo, si escuchas una manzana, es posible que lo sepas, oh, el color es rojo:

package com.example.vo;

import com.example.annotion.Color;
import lombok.Data;

@Data
public class Apple {

    @Color(value = "red")
    private String name;

    private Double price;

}

Obtención de anotaciones:

package com.example.demo;

import com.example.annotion.Color;
import com.example.vo.Apple;

import java.lang.reflect.Field;

public class MyTest {
    public static void main(String[] args) throws Exception{

        // 加载类
        Class<?> appleClass = Class.forName("com.example.vo.Apple");
       //这样也可以  Class<? extends Apple> appleClass = new Apple().getClass();
        Field[] fields = appleClass.getDeclaredFields();
        for (Field field:fields) {
            field.setAccessible(true);
            Color color = field.getAnnotation(Color.class);
            if (color != null){  // 说明有Color 的注解
                System.out.println("apple 的颜色是:" + color.value());
                System.out.println(" 属性的名称是: " + field.getName());
            }
            break;
        }
        System.out.println("this is end.....");
    }
}

Resultado de salida:

Connected to the target VM, address: '127.0.0.1:58458', transport: 'socket'
apple 的颜色是:red
 属性的名称是: name
this is end.....
Disconnected from the target VM, address: '127.0.0.1:58458', transport: 'socket'

Process finished with exit code 0

Por supuesto, cuando vea este ejemplo, debe sentir --- basura, una operación de adquisición tan ingenua, ¡yo también lo haré!

Sí, el análisis de esta anotación es muy básico y puede ser escrito por cualquiera que haya aprendido un poco de Java.

Sin embargo, el principio sigue siendo el mismo, y los conceptos básicos a menudo son muy importantes y críticos, y fácilmente puede pasar por alto muchas cosas si no lo sabe.

Permítanme hablar sobre un procesamiento de anotaciones utilizado en mi trabajo anterior:

Un proyecto necesita cargar archivos en muchos lugares y luego guardar la información del archivo. Una página proviene de la interfaz, y puede haber muchos tipos de archivos que deban guardarse, como ImageVo. Por supuesto, esto no debe procesarse uno por uno. Es demasiado engorroso, y este tipo de operación de guardado que tiene La pequeña relación comercial debe ser unificada encapsulada para ser la más razonable.

Por supuesto, puede sacar los parámetros cada vez y pasarlos a un método, pero ¿tiene que tomar los parámetros para cada solicitud? ¿Y si hay más niveles de parámetros? Tienes que agregar juicios, etc.

¡Por supuesto, esto se puede manejar bien con anotación + reflexión!

Intenta escribirlo esta semana. Antes era demasiado vago. Es necesario arreglar algo, O (∩_∩) O jaja ~

 

 

Supongo que te gusta

Origin blog.csdn.net/zsah2011/article/details/105397010
Recomendado
Clasificación