自定义注解实现

自定义注解实现,第1张

定义注解实现

在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一、侵入性小的自定义功能。

比如我们实现一个统一打印日志的自定义注解

引入依赖

    org.springframework.boot
    spring-boot-starter-aop



        
            com.google.guava
            guava
            18.0
        

        
            com.alibaba
            fastjson
            1.2.54
        
项目结构
D:JAVA-RES
├─.idea
│  └─libraries
├─.mvn
│  └─wrapper
├─src
│  ├─main
│  │  ├─java
│  │  │  └─yeye
│  │  │      └─devops
│  │  │          ├─annotation
│  │  │          ├─config
│  │  │          ├─control
│  │  │          ├─model
│  │  │          └─service
│  │  └─resources
│  │      ├─static
│  │      └─templates
│  └─test
│      └─java
│          └─yeye
│              └─devops
└─target
    ├─classes
    │  └─yeye
    │      └─devops
    │          ├─annotation
    │          ├─config
    │          ├─control
    │          ├─model
    │          └─service
    ├─generated-sources
    │  └─annotations
    ├─generated-test-sources
    │  └─test-annotations
    └─test-classes
        └─yeye
            └─devops
PS D:>

定义注解

定义注解的属性:

package yeye.devops.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface TraceLog {
    
    String business();

    
    String module();
}
定义切面
package yeye.devops.annotation;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.ImmutableList;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.List;

@Aspect
@Component
@Slf4j

public class TraceLogSupport {

    @Pointcut("@annotation(yeye.devops.annotation.TraceLog)")
    private void pointcut() {
    }

    @Before("pointcut()&&@annotation(traceLog)")
    public void before(JoinPoint joinPoint, TraceLog traceLog) {
        Object[] args = joinPoint.getArgs();
        log.error(generateLog(traceLog, JSON.toJSonString(args)));
    }

    private String generateLog(TraceLog traceLog, String args) {
        List elements = ImmutableList.of(
                traceLog.business(),
                traceLog.module(),
                args
        );
        return String.join(";", elements);
    }


}
入参实体
package yeye.devops.model;

import lombok.Data;

@Data
public class LoginParam {
    private String username;
    private String password;
}
验证
curl http://127.0.0.1:8080/login?username=knight&password=zlong

# 结果返回
LoginParam(username=knight, password=zlong)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5562872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存