当前位置: 首页 > article >正文

自定义注解:让代码更加简洁优雅

自定义注解:让代码更加简洁优雅

  • 前言
  • 例子:日志打印
  • 自定义注解
  • 实现
  • 具体使用
  • 总结

前言

在 Java 开发中,注解是一种非常常见的语言特性。Java 自带了一些常用的注解,如 @Override、@Deprecated 等。但有时候我们需要自己定义一些注解,来标注我们自己的业务逻辑,或者是对第三方库的使用进行规范等。

自定义注解是一种非常强大的工具,可以让我们的代码更加简洁、优雅、易读,提高代码的可维护性。本文将通过一个例子来介绍如何自定义注解。

例子:日志打印

在我们的日常开发中,经常需要打印日志,以便我们能够了解程序的运行情况。我们可以使用 Java 自带的日志库 java.util.logging,也可以使用第三方的日志库,如 Log4j、Slf4j 等。

无论我们使用什么日志库,都需要写出类似下面的代码:

public class MyClass {
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

    public void myMethod() {
        logger.debug("debug message");
        logger.info("info message");
        logger.warn("warn message");
        logger.error("error message");
    }
}

每个方法都需要写出类似的代码,这显然很冗长。我们可以使用自定义注解来简化这个过程。

自定义注解

首先我们需要定义一个注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value();
}

这个注解的作用是在方法上打印日志,value() 方法返回需要打印的日志信息。

接下来,我们可以在需要打印日志的方法上使用这个注解:

public class MyClass {
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

    @Log("myMethod start")
    public void myMethod() {
        // do something
    }
}

当我们调用 myMethod() 方法时,注解 @Log 将自动打印日志。这样,我们就不需要在每个方法中手动写出日志打印的代码了。

实现

关于aop的知识大家可以看我的这篇文章:利用Spring框架实现横向关注点
下面是一个简单的实现。我们需要定义一个切面,来处理这个注解:

@Aspect
@Component
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    @Around("@annotation(com.example.Log)")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        Log logAnnotation = method.getAnnotation(Log.class);
        String logMsg = logAnnotation.value();
        logger.info("{}.{} - start: {}", joinPoint.getTarget().getClass().getSimpleName(), method.getName(), logMsg);
        Object result = joinPoint.proceed();
        logger.info("{}.{} - end", joinPoint.getTarget().getClass().getSimpleName(), method.getName());
        return result;
    }
}

这个切面使用了 AspectJ 的注解机制,使用 @Aspect 注解标注这是一个切面,使用 @Component 注解将这个切面注入到 Spring 容器中。

@Around 注解用于定义一个环绕通知,可以在方法执行前后进行一些操作。这个环绕通知中,我们通过 @annotation(com.example.Log) 注解来获取方法上的 @Log 注解,并从中获取日志信息。然后在方法执行前后打印日志。

具体使用

我们需要在 Spring 配置文件中开启注解扫描,以便 Spring 能够扫描到我们定义的注解和切面:

<context:component-scan base-package="com.example" />

然后我们就可以在代码中使用我们定义的 @Log 注解了:

public class MyClass {
    @Log("myMethod start")
    public void myMethod() {
        // do something
    }
}

J 的注解机制,使用 @Aspect 注解标注这是一个切面,使用 @Component 注解将这个切面注入到 Spring 容器中。

@Around 注解用于定义一个环绕通知,可以在方法执行前后进行一些操作。这个环绕通知中,我们通过 @annotation(com.example.Log) 注解来获取方法上的 @Log 注解,并从中获取日志信息。然后在方法执行前后打印日志。

使用
我们需要在 Spring 配置文件中开启注解扫描,以便 Spring 能够扫描到我们定义的注解和切面:

xml
Copy code
<context:component-scan base-package=“com.example” />
然后我们就可以在代码中使用我们定义的 @Log 注解了:

java
Copy code
public class MyClass {
@Log(“myMethod start”)
public void myMethod() {
// do something
}
}
当我们调用 myMethod() 方法时,注解 @Log 将自动打印日志。

总结

自定义注解是一种非常强大的工具,可以让我们的代码更加简洁、优雅、易读,提高代码的可维护性。本文通过一个例子介绍了如何定义和使用自定义注解。在实际开发中,我们可以结合 AOP、反射等技术,使用自定义注解来实现更多的功能。


http://www.kler.cn/a/5584.html

相关文章:

  • Unity3D仿星露谷物语开发8之角色移动
  • Java爬虫实战:深度解析VIP商品详情获取技术
  • 家政预约小程序数据库设计
  • 【Linux】centos7安装php7.4
  • python中使用selenium执行组合快捷键ctrl+v不生效问题
  • linux中 mysql备份
  • 【SpringSecurity】认证授权框架——SpringSecurity使用方法
  • JavaWeb——过滤器Filter和拦截器Interceptor
  • 谷粒商城笔记+踩坑(18)——购物车
  • 2023年南京晓庄学院五年一贯制专转本软件工程专业考试大纲
  • 一文读懂 mysql 为什么要两阶段提交以及两阶段提交原理
  • 面试官灵魂拷问[二]:SQL 语句中 where 条件后写上 1=1 是什么意思?
  • 02_Python 学习基础
  • 【算法】Raft算法详解
  • C++ 20 list容器
  • SpringBoot+vue的图书管理系统
  • Java中字节流的相关内容
  • markdown
  • 【linux】基于阻塞队列的生产者消费者模型(条件变量)
  • springboot项目中, 序列化对象需要注意什么?
  • 基于springboot实现结合疫情情况的婚恋系统演示【附项目源码】
  • php mysql网络考试系统dzkf8994
  • Raft协议详解
  • DFS+记忆化剪枝--[NOIP2017 普及组] 棋盘
  • 启动Hadoop报错【Error: JAVA_HOME is not set and could not be found.】
  • JUnit5用户手册~并行执行