Springboot自定义注解&传参&简单应用

Springboot自定义注解&传参&简单应用

1、目录结构:

1.1 annotation为自定义注解位置

在这里插入图片描述
在这里插入图片描述

2、自定义注解

2.1 自定义两个注解LogController、TimeConsuming用来记录日志和统计方法耗时,其中LogController有三个参数

在这里插入图片描述

@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、注解使用

3.1 在需要记录日志和统计方法耗时的方法上使用注解
 	@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、使用Aspect实现功能

4.1 通过Aop以注解作为切点切入方法,实现业务功能

在这里插入图片描述

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

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

4.2 取注解中参数

比如下面方法实现记录日志功能

    @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()));
    }

统计方法耗时方法

	@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;
    }
MySQL关联查询是一种在多个表之间建立关联并检索相关数据的查询方式。MySQL关联查询的语法通常使用JOIN关键字将两个或多个表连接在一起,根据指定的连接条件来获取相关的数据。 在MySQL中,关联查询可以通过使用内连接、外连接或交叉连接来实现不同类型的连接操作。内连接通过匹配两个表之间的共同值来返回符合条件的数据。外连接可以返回不满足连接条件的记录,并将NULL值填充到相应的列中。而交叉连接则返回两个表的所有可能组合。 关联查询可以在SELECT语句的FROM子句中使用子查询来实现更复杂的查询需求。子查询可以作为主查询的一部分,并且可以在WHERE子句、FROM子句、HAVING子句或SELECT子句中使用。 总结起来,MySQL关联查询是通过连接多个表并根据指定的连接条件来检索相关数据的查询方式。它可以使用内连接、外连接或交叉连接,并且可以在主查询的不同位置嵌入子查询来实现更复杂的查询需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [《MySQL数据库关联查询](https://blog.youkuaiyun.com/qianfeng_dashuju/article/details/107099405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值