美文网首页
Aspect获取自定义注解

Aspect获取自定义注解

作者: 675ea0b3a47d | 来源:发表于2021-04-09 21:21 被阅读0次

直接进入主题,什么是注解?

注解是一种能被添加到Java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。
元注解:

  元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
    1.@Target,
    2.@Retention,
    3.@Documented,
    4.@Inherited

@Target说明了Annotation所修饰的对象范围

       1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention定义了该Annotation被保留的时间长短

       1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

实例:自定义注解,代码主要分为三块,
1,自定义注解类的编写:MyAnnotion
2,切面的编写:MyAspect;
3,自定义注解的使用+测试;

代码结构如下所示


image.png

注解类MyAnnotation详细代码,@Target(ElementType.METHOD)代表该注解作用于方法,@Retention(RetentionPolicy.RUNTIME)表示在运行时保留,

package com.aop.annotation;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {

    String value() default "";

}

MyAspect详细代码。 @Pointcut(value = "@annotation(com.aop.annotation.MyAnnotation)")表示切点为带有MyAnnotation的方法,

package com.aop.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;

@Aspect
@Component
public class MyAspect {

    private static final Logger logger = LoggerFactory.getLogger(MyAspect.class);

    @Pointcut(value = "@annotation(com.aop.annotation.MyAnnotation)")
    public void annotationPointCut() {

    }


    //@Around("annotationPointCut()")
    @Before("annotationPointCut()")
    public Object doBefore(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getMethod().getName();
        System.out.println("方法名:" + methodName);
        Annotation[] annotations = signature.getMethod().getAnnotations();
        for (int i = 0; i < annotations.length; i++) {
            System.out.println(annotations[i]);
        }
        return null;
    }

}

使用注解类

package com.aop.controller;

import com.aop.annotation.MyAnnotation;
import org.springframework.stereotype.Service;

@Service
public class AopController {

    @MyAnnotation("yangNiMa")
    public void testAopAndAnnotion(){
        System.out.println("=======12345678=========");
    }
}

测试类

package com.aop;

import com.aop.annotation.MyAnnotation;
import com.aop.controller.AopController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class AopApplicationTests {

    @Autowired
    private AopController aopController;

    @Test
    void contextLoads() {
    }

    @Test
    public void testAnnotionAndAspect() {
        aopController.testAopAndAnnotion();
    }

}


测试结果,通过Aspect切面拿到带有注解类的方法和自定义注解的值

image.png

相关文章

网友评论

      本文标题:Aspect获取自定义注解

      本文链接:https://www.haomeiwen.com/subject/fjpwkltx.html