Spring AnnotationUtils工具类的使用

4,729 阅读1分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

AnnotationUtils位于spring-core包下面,提供一些方法用于简单的获取到注解相关信息

image.png

1.findAnnotation

获取Class/Method上面标注的注解

// 获取Class上面标注的注解
public static <A extends Annotation> A findAnnotation(Class<?> clazz, @Nullable Class<A> annotationType)

// 获取Method上面的注解信息
public static <A extends Annotation> A findAnnotation(Method method, @Nullable Class<A> annotationType)

案例

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * Description:
 *
 * @author jack
 * @date 2021/8/26 8:38 下午
 */
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/main")
@Slf4j
public class MainController {

    @Bean(name = "car")
    public void car() {

    }

    public static void main(String[] args) {
        // 获取Class上面的注解
        RequestMapping requestMapping = AnnotationUtils.findAnnotation(MainController.class, RequestMapping.class);
        System.out.println(requestMapping);
        System.out.println(Arrays.toString(requestMapping.value()));
        
        // 获取Method上面的注解
        Method carMethod = ReflectionUtils.findMethod(MainController.class, "car");
        Bean bean = AnnotationUtils.findAnnotation(carMethod, Bean.class);
        System.out.println(Arrays.toString(bean.name()));
    }

}

输出结果

image.png

2.getAnnotationAttributes

获取annotation的所有属性

public static Map<String, Object> getAnnotationAttributes(Annotation annotation)

案例

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * Description:
 *
 * @author jack
 * @date 2021/8/26 8:38 下午
 */
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/main")
@Slf4j
public class MainController {

    public static void main(String[] args) {
        // 获取Class上面的注解
        RequestMapping requestMapping = AnnotationUtils.findAnnotation(MainController.class, RequestMapping.class);
        // 获取 RequestMapping注解的所有属性
        Map<String, Object> annotationAttributes = AnnotationUtils.getAnnotationAttributes(requestMapping);
        System.out.println(annotationAttributes);

    }
}

输出结果

image.png

3.isAnnotationDeclaredLocally

验证annotation是否直接注释在类上而不是集成来的。

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Description:
 *
 * @author jack
 * @date 2021/8/26 8:38 下午
 */
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/main")
@Slf4j
public class MainController {

    public static void main(String[] args) {
        boolean isExistsRequestMapping = AnnotationUtils.isAnnotationDeclaredLocally(RequestMapping.class, MainController.class);
        System.out.println(isExistsRequestMapping);

        boolean isExistsMapping = AnnotationUtils.isAnnotationDeclaredLocally(Mapping.class, MainController.class);
        System.out.println(isExistsMapping);
    }

}

输出结果

image.png

MainController上标注了@RequestMapping,而@RequestMapping注解上面标注了@Mapping注解 所以在调用一下代码时 输出为false

AnnotationUtils.isAnnotationDeclaredLocally(Mapping.class, MainController.class)