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

实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解:

1. 引入AOP依赖

在pom文件中引入AOP的依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

2. 定义注解

定义注解的属性:

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface TraceLog {
  5. /**
  6. * 业务
  7. */
  8. String business();
  9. /**
  10. * 模块
  11. */
  12. String module();
  13. }

3. 定义切面

  1. @Aspect
  2. @Component
  3. @Slf4j
  4. public class TraceLogSupport {
  5. @Pointcut("@annotation(com.acode.log.annotation.TraceLog)")
  6. private void pointcut() {
  7. }
  8. @Before("pointcut()&&@annotation(traceLog)")
  9. public void before(JoinPoint joinPoint, TraceLog traceLog) {
  10. Object[] args = joinPoint.getArgs();
  11. log.error(generateLog(traceLog, JSON.toJSONString(args)));
  12. }
  13. private String generateLog(TraceLog traceLog, String args) {
  14. List<String> elements = ImmutableList.of(
  15. traceLog.business(),
  16. traceLog.module(),
  17. args
  18. );
  19. return String.join(";", elements);
  20. }
  21. }

使用注解

在想要使用的方法上加上注解即可,使用例子如下:

  1. @RequestMapping("/login")
  2. @TraceLog(business = "CRM", module = "LOGIN")
  3. public String login(LoginParam param) {
  4. return param.toString();
  5. }

其中,入参的定义如下:

  1. public class LoginParam {
  2. private String userName;
  3. private String password;
  4. }

当访问登录接口时,就会在日志中打印入口参数(在线上环境中是不允许直接明文打印用户的密码):

  1. CRM;LOGIN;[{"password":"123456","userName":"admin"}]

Spring Boot实现自定义注解的更多相关文章

  1. Spring Boot中自定义注解+AOP实现主备库切换

    摘要: 本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的 ...

  2. spring boot通过自定义注解和AOP拦截指定的请求

    一 准备工作 1.1 添加依赖 通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截 <dependency> <group ...

  3. redis分布式锁-spring boot aop+自定义注解实现分布式锁

    接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...

  4. Spring Boot Web 自定义注解篇(注解很简单很好用)

    自从spring 4.0 开放以后,可以添加很多新特性的注解了.使用系统定义好的注解可以大大方便的提高开发的效率. 下面我贴一段代码来讲解注解: 通过小小的注解我们支持了以下功能: 使 spring. ...

  5. spring boot aop 自定义注解 实现 日志检验 权限过滤

    核心代码: package com.tran.demo.aspect; import java.lang.reflect.Method; import java.time.LocalDateTime; ...

  6. (32)Spring Boot使用@SpringBootApplication注解,从零开始学Spring Boot

    [来也匆匆,去也匆匆,在此留下您的脚印吧,转发点赞评论] 如果看了我之前的文章,这个节你就可以忽略了,这个是针对一些刚入门的选手存在的困惑进行写的一篇文章. 很多Spring Boot开发者总是使用 ...

  7. Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置

    用过 Spring Boot 的小伙伴都知道,我们只需要在项目中引入 spring-boot-starter-web 依赖,SpringMVC 的一整套东西就会自动给我们配置好,但是,真实的项目环境比 ...

  8. spring boot @ConditionalOnxxx相关注解总结

    Spring boot @ConditionalOnxxx相关注解总结 下面来介绍如何使用@Condition public class TestCondition implements Condit ...

  9. Spring boot 使用的注解有哪些?

    Spring boot 使用的注解有哪些? 注解 作用 @SpringBootApplication 等价于 @Configuration + @EnableAutoConfiguration + @ ...

随机推荐

  1. LeetCode_35. Search Insert Position

    35. Search Insert Position Easy Given a sorted array and a target value, return the index if the tar ...

  2. Node.js ORM框架Sequelize使用示例

    示例代码: const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username' ...

  3. LODOP中纸张高度不定超文本和纯文本对比

    关于纸张高度不定的小票打印,建议使用纯文本进行设计,避免纸张高度引起变形,或超文本解析差异造成一些影响:LODOP纸张高度不定的纯文本累计高度 上面的链接的博文里,纯文本可通过间距和高度值累计,得出最 ...

  4. CentOS 7 vi详解

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  5. golang web框架 beego 学习 (五) 配置文件

    app.conf: appname = gowebProject httpport = runmode = dev copyrequestbody = true [db] host= localhos ...

  6. rebbitMQwindows安装及使用

    python中RabbitMQ的使用(安装和简单教程) 1,简介 RabbitMQ(Rabbit Message Queue)是流行的开源消息队列系统,用erlang语言开发.   1.1关键词说明: ...

  7. ruby tk实现简易计算器

    #encding:GBK require 'tk' module Const WIDTH_OF_PANEL = 370 HEIGHT_OF_PANEL = 520 SIZE_OF_BUTTON_H = ...

  8. 提车应该检查哪?4S店都怕你检查这4个“雷区”,别等后悔才知道

    https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9381645601643691163% ...

  9. 用css美化select框

    先上代码: .selectData{ height: 0.42rem; position: absolute; right:.28rem; top:.30rem; //去边框 border: none ...

  10. java学习基础知识入门

    基础入门知识(一) 一.java技术的分类 java按照技术标准和应用场景的不同分为三类,分别是JAVASE.JAVAEE.JAVAME JAVASE : 平台标准版,用于开发部署桌面,服务器以及嵌入 ...