JAVA自定义注解以及应用

目录

    • 一、简单介绍
      • 1、什么是 Java 自定义注解
      • 2、自定义注解的定义语法
    • 二、Java代码中如何使用
      • 1、使用自定义注解
      • 2、通过反射访问自定义注解
    • 三、如何在springboot项目应用
      • 1、创建自定义注解
      • 2、创建切面类(Aspect)来处理注解
      • 3、在控制器(Controller)或服务(Service)方法中使用自定义注解

一、简单介绍

1、什么是 Java 自定义注解

注解(Annotation)是 Java 5.0 引入的一种元数据形式。它提供了关于程序代码的额外信息,但本身不会直接影响程序的运行逻辑。自定义注解允许开发者定义自己的注解类型,用于标记类、方法、变量等程序元素,以传达特定的意图或提供配置信息。
例如,可以定义一个自定义注解来标记需要进行性能监控的方法,或者标记一个需要进行权限验证的接口。

2、自定义注解的定义语法

定义一个自定义注解使用@interface关键字。以下是一个简单的自定义注解MyAnnotation的定义:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "";
}
  • @Target:用于指定注解可以应用的程序元素类型。在上述代码中,ElementType.METHOD表示这个注解只能应用于方法。其他可能的值包括ElementType.TYPE(应用于类、接口或枚举)、ElementType.FIELD(应用于字段)等。
  • @Retention:用于指定注解的保留策略。RetentionPolicy.RUNTIME表示这个注解可以在运行时通过反射访问。其他保留策略包括RetentionPolicy.CLASS(注解在编译后的字节码文件中存在,但在运行时不可用)和RetentionPolicy.SOURCE(注解只在源代码中存在,编译后就不存在了)。
  • 自定义注解内部可以定义成员,如value()。它类似于接口中的方法定义,在使用注解时可以为这些成员赋值。

二、Java代码中如何使用

1、使用自定义注解

以下是一个使用MyAnnotation注解的示例:

class MyClass {
    @MyAnnotation("This is a sample method")
    public void myMethod() {
        System.out.println("Method executed");
    }
}

在myMethod方法上使用了MyAnnotation注解,并为value成员赋值为"This is a sample method"。

2、通过反射访问自定义注解

可以使用 Java 的反射机制在运行时访问注解信息。以下是一个示例代码,用于访问MyClass类中myMethod方法上的MyAnnotation注解:

import java.lang.reflect.Method;
public class Main {
    public static void main(String[] args) {
        try {
            Class<?> clazz = MyClass.class;
            Method method = clazz.getMethod("myMethod");
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
            if (annotation!= null) {
                System.out.println("Annotation value: " + annotation.value());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

首先通过MyClass.class获取类对象,然后使用getMethod方法获取myMethod方法对象。接着通过getAnnotation方法获取MyAnnotation注解对象。如果注解对象不为空,就可以访问注解中的成员值,如annotation.value()。
通过以上步骤,可以定义、使用和访问自定义注解,从而在 Java 程序中添加自定义的元数据,方便进行各种功能扩展,如配置管理、AOP(面向切面编程)等。

三、如何在springboot项目应用

1、创建自定义注解

首先,在 Spring Boot 项目中创建一个自定义注解,用于标记需要特定处理的类或方法。例如,创建一个用于记录操作日志的注解@OperationLog。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
    String description() default "";
}

这个注解使用@Target指定它可以应用于方法,@Retention指定在运行时可以通过反射访问。它还有一个成员description,用于记录操作的描述信息。

2、创建切面类(Aspect)来处理注解

在 Spring Boot 中,可以使用 AspectJ 实现面向切面编程来处理自定义注解。首先,需要添加spring-boot-starter-aop依赖到项目的pom.xml文件中。

<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-aopartifactId>
	<version>2.6.11version>
	<scope>compilescope>
dependency>

然后创建一个切面类,用于拦截带有@OperationLog注解的方法,并记录操作日志

 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 @Aspect
@Component
 public class OperationLogAspect {
     private static final Logger logger = LoggerFactory.getLogger(OperationLogAspect.class);
     @Around("@annotation(OperationLog)")
     public Object logOperation(ProceedingJoinPoint joinPoint) throws Throwable {
         // 获取方法上的注解
         OperationLog annotation = getAnnotation(joinPoint);
         String description = annotation.description();
         logger.info("开始执行操作: {}", description);
         // 执行被注解的方法
         Object result = joinPoint.proceed();
         logger.info("操作执行成功: {}", description);
         return result;
     }
     private OperationLog getAnnotation(ProceedingJoinPoint joinPoint) {
         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
         return signature.getMethod().getAnnotation(OperationLog.class);
     }
 }

这个切面类使用@Aspect注解标记,表示它是一个切面。@Component注解将它注册为 Spring 组件。@Around注解用于定义环绕通知,它拦截带有@OperationLog注解的方法。在通知方法logOperation中,首先获取注解中的描述信息,记录操作开始的日志,然后执行被注解的方法,最后记录操作成功的日志。

3、在控制器(Controller)或服务(Service)方法中使用自定义注解

在 Spring Boot 的控制器或服务层方法中使用自定义注解。例如,在一个简单的用户服务中有一个修改用户信息的方法。

import org.springframework.stereotype.Service;
@Service
public class UserService {
    @OperationLog(description = "修改用户信息")
    public void updateUserInfo(User user) {
        // 实际的用户信息修改逻辑
    }
}

当updateUserInfo方法被调用时,OperationLogAspect切面类会拦截这个方法,记录操作开始和成功的日志。
通过这种方式,可以在 Spring Boot 项目中利用自定义注解和 AOP 来实现功能的横切关注点,如日志记录、权限验证、性能监控等,使得代码更加模块化和易于维护

你可能感兴趣的:(java小知识集锦,java,注解,自定义注解)