Anotación Java fácil de entender serie de tutoriales tres demostraciones de anotaciones personalizadas

Según el tutorial anterior, la escritura de anotaciones personalizadas se divide en tres pasos: 1. Definir el formato de la anotación 2. Configurar la meta anotación 3. Definir el parámetro 4. Definir la lógica de la anotación

Este artículo toma como ejemplo la escritura de múltiples anotaciones de cambio de fuente de datos para comprender el proceso de escritura de anotaciones personalizadas. La lógica de las anotaciones de cambio de fuente de datos múltiples es: esta anotación se puede utilizar en el método, de acuerdo con el atributo de anotación, cambiar al datos correspondientes antes de ejecutar la fuente del método actual.

1. Defina el formato de anotación

public @interface ChooseDataSource {

 
}

2. Configurar meta anotaciones

Defina el método de ubicación que puede utilizar la anotación, etc., y el ciclo de vida de la anotación.

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ChooseDataSource {

}

3. Definir parámetros 

Establezca el parámetro en enumeración y configure el valor predeterminado como fuente de datos principal.

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ChooseDataSource {

    AllDatasourceEnum dataSource() default AllDatasourceEnum.MASTER;
}

4. Defina la lógica de la anotación

(1) Anotación personalizada: ChooseDataSource 

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ChooseDataSource {

    AllDatasourceEnum dataSource() default AllDatasourceEnum.MASTER;
}

(2) Uso de lógica específica (aop intercepta antes de llamar a las anotaciones) y (reflexión para obtener anotaciones y métodos de ejecución)

Para demostrar que el código es más simple, el código para múltiples fuentes de datos no está escrito aquí (si desea saber más al respecto, consulte otro blog para configurar springboot múltiples fuentes de datos: https://blog.csdn.net/ Mint6 / article / details / 92261790 ) En este artículo, siempre que sepa qué cadena DynamicDataSourceContextHolder.setDateSoureType ("principal") establece, seleccionará la fuente de datos correspondiente.

Codifique la lógica de ejecución general : intercepte el método en el paquete correspondiente a través de aop, antes y después de la ejecución, determine si hay una anotación, si la hay, saque el atributo dataSource y configure DynamicDataSourceContextHolder.setDateSoureType ("main") para cambiar los datos fuente .

Establecer el alcance efectivo de las anotaciones : donde: @Before ("ejecución (public * com.fast.framework.dao. *. *. * (..)) || @annotation (com.fast.framework.annotation.ChooseDataSource)

") es el alcance efectivo de la ejecución de la anotación que configuré: si el método de anotación se usa en el paquete com.fast.framework.dao y el método de anotación ChooseDataSource, la lógica de ejecución de la anotación es efectiva. Si esta no es la anotación debajo este paquete, el uso no es válido .

 @Before("execution(public * com.fast.framework.dao.*.*.*(..)) || @annotation(com.fast.framework.annotation.ChooseDataSource)")
    public void before(JoinPoint joinPoint) {
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        /*获取方法上的注解*/
        ChooseDataSource chooseDataSource = method.getAnnotation(ChooseDataSource.class);
        //获取注解上的数据源的值的信息
        String dataSourceName = chooseDataSource.dataSource().name();
        if (dataSourceName != null) {
            //给当前的执行SQL的操作设置特殊的数据源的信息
            DynamicDataSourceContextHolder.setDateSoureType(dataSourceName);
        }
    }

(3) Tipo de hoja: AllDatasourceEnum 

public enum AllDatasourceEnum {

     MASTER(0, "主数据库"),
     SECOND(1, "第二个数据库");

     private int code;
     private String msg;

     AllDatasourceEnum(int code, String msg) {
          this.code = code;
          this.msg = msg;
     }

     public int getCode() {
          return code;
     }

     public String getMsg() {
          return msg;
     }
}

Resumen : La demostración en este capítulo debe ser fácil de entender. Depende principalmente del cuarto paso para definir la lógica de ejecución de la anotación . Si no lo entiende, mire los artículos antes y después de la serie para resumir.

Supongo que te gusta

Origin blog.csdn.net/Mint6/article/details/103835990
Recomendado
Clasificación