Springboot anotación personalizada y transferencia de parámetros y aplicación simple

Springboot anotación personalizada y transferencia de parámetros y aplicación simple

1. Estructura de directorio:

1.1 la anotación es una posición de anotación personalizada

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

2. Anotaciones personalizadas

2.1 Personalice dos anotaciones LogController y TimeConsuming para registrar registros y métodos estadísticos que consumen mucho tiempo, entre los cuales LogController tiene tres parámetros

Inserte la descripción de la imagen aquí

@Target({
    
    ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogController {
    
    
    // 具体操作
    String description();

    // 日志级别
    int logLevel() default LogLevelConstant.INFO;

    // 日志进程/方法名
    String method();
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TimeConsuming {
    
    
}

3. Uso de anotaciones

3.1 Utilice anotaciones sobre métodos que requieren registro y métodos estadísticos que consumen mucho tiempo

 	@PostMapping("/createUser")
    @LogController(description = "创建用户", method = "/createUser")
    @TimeConsuming
    public ResponseEntity<ResponseResultVO> createUser(@Valid @RequestBody SysUsersVo sysUsersVo) {
    
    
        log.info("UserManager = start create user [{}] pwd [{}]", sysUsersVo.getUserName(), sysUsersVo.getUserPwd());

        return ResponseEntity.ok(usersService.createUser(sysUsersVo).orElse(ResponseResultVO.builder()
                .code(ErrorCodeConstant.SYSTEM_ERROR)
                .msg(ErrorMsgConstant.SYSTEM_ERROR)
                .build()));
    }

4. Utilice Aspect para implementar funciones

4.1 A través de Aop, use las anotaciones como un método de corte puntual para realizar funciones comerciales

Inserte la descripción de la imagen aquí

	@Pointcut("@annotation(com.pet.annotation.LogController)")
    public void annotationPoint() {
    
    
    }

    @Pointcut("@annotation(com.pet.annotation.TimeConsuming)")
    public void methodTimePoint() {
    
    
    }

4.2 Toma los parámetros en la anotación

Por ejemplo, el siguiente método implementa la función de registro

    @Before(value = "annotationPoint() && @annotation(logController)", argNames = "joinPoint, logController")
    public void beforeController(JoinPoint joinPoint, LogController logController) {
    
    
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        HttpSession session = request.getSession();
        SysUsers user = (SysUsers) session.getAttribute(HttpConstant.SESSION_USER);
        String realMethodName = joinPoint.getSignature().getName();

        log.info("Aspect = [{}] ,user [{}] , method [{}] , logLevel [{}] , do [{}] , realMethod [{}]",
                new Date(), user == null ? "system" : user.getUserName(), logController.method(), logController.logLevel(), logController.description(), realMethodName);

        // 异步处理日志
        publisher.publishEvent(new LogToDbEvent(
                LogToDbEventEntity.builder()
                        .date(new Date())
                        .userName(user == null ? "system" : user.getUserName())
                        .method(logController.method())
                        .logLevel(logController.logLevel())
                        .description(logController.description())
                        .realMethod(realMethodName)
                        .build()));
    }

Método estadístico método que consume mucho tiempo

	@Around(value = "methodTimePoint()")
    public Object apiTimeConsuming(ProceedingJoinPoint pjp) throws Throwable {
    
    
        long begin = System.currentTimeMillis();
        String method = pjp.getSignature().getName();
        String className = pjp.getTarget().getClass().getName();

        Object ret = pjp.proceed();
        log.info("Aspect = [{}] ,class [{}] , method [{}] , time consuming[{}]", new Date(), className, method, System.currentTimeMillis() - begin);
        return ret;
    }

Supongo que te gusta

Origin blog.csdn.net/weixin_38045214/article/details/114967252
Recomendado
Clasificación