玉树电子商务网站建设公司,小米发布会官网,宝应县网络推广公司,无锡 网站设计元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解
元注解就是定义注解的注解#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解… 元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解
元注解就是定义注解的注解是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解类实现声明类 Class声明类别 Category声明扩展 ExtensionTarget放在自定义注解的上边表明该注解可以使用的范围Inherited允许子类继承父类的注解在子类中可以获取使用父类注解Documented表明这个注释是由 Javadoc 记录的interface用来自定义注释类型
1.1 Target
该注解的作用是告诉 Java 将自定义的注解放在什么地方比如类、方法、构造器、变量上等。它的值是一个枚举类型有如下属性值。
ElementType.CONSTRUCTOR用于描述构造器。ElementType.FIELD用于描述成员变量、对象、属性包括 enum 实例。ElementType.LOCAL_VARIABLE用于描述局部变量。ElementType.METHOD用于描述方法。ElementType.PACKAGE用于描述包。ElementType.PARAMETER用于描述参数。ElementType.TYPE用于描述类、接口包括注解类型或 enum 声明。
1.2 Retention
该注解用于说明自定义注解的生命周期在注解中有三个生命周期。
RetentionPolicy.RUNTIME始终不会丢弃运行期也保留该注解可以使用反射机制读取该注解的信息。自定义的注解通常使用这种方式。RetentionPolicy.CLASS类加载时丢弃默认使用这种方式。RetentionPolicy.SOURCE编译阶段丢弃自定义注解在编译结束之后就不再有意义所以它们不会写入字节码。Override、SuppressWarnings 都属于这类注解。
1.3 Inherited
该注解是一个标记注解表明被标注的类型是可以被继承的。如果一个使用了 Inherited 修饰的 Annotation 类型被用于一个 Class则这个 Annotation 将被用于该 Class 的子类。
1.4 Documented
该注解表示是否将注解信息添加在 Java 文档中。
1.5 interface
该注解用来声明一个注解其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称返回值类型就是参数的类型返回值类型只能是基本类型、Class、String、enum。可以通过 default 来声明参数的默认值。
定义注解格式见以下代码
public interface 注解名{定义体}2.自定义注解
有时需要自定义注解来快捷地实现功能。本实例演示如何自定义注解以及实现业务逻辑处理。
2.1 创建自定义注解类
package com.example.demo;import org.springframework.stereotype.Component;import java.lang.annotation.*;Target({ElementType.METHOD, ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
Documented
Component
public interface MyTestAnnotation {String value();
}代码解释如下。
使用 Target 注解标注作用范围。使用 Retention 注解标注生命周期。使用 Documented 将注解信息添加在 Java 文档中。
2.2 实现业务逻辑
以 AOP 的方式实现业务逻辑见以下代码
package com.example.demo;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;Aspect
Component
public class TestAnnotationAspect {// 拦截被 TestAnnotation 注解的方法如果需要拦截指定 package 指定规则名称的方法可以使用表达式 execution(...)Pointcut(annotation(com.example.demo.MyTestAnnotation))public void myAnnotationPointCut() {}Before(myAnnotationPointCut())public void before(JoinPoint joinPoint) throws Throwable {MethodSignature sign (MethodSignature) joinPoint.getSignature();Method method sign.getMethod();MyTestAnnotation annotation method.getAnnotation(MyTestAnnotation.class);// 获取注解参数System.out.print(打印TestAnnotation 参数 annotation.value());}}类注解
Aspect这是一个切面注解用于标记这个类为一个切面类。切面类包含了通知Advice定义了要在哪些连接点JoinPoint上执行的逻辑。Component这是一个组件注解用于将这个切面类注册为 Spring 容器中的一个组件以便 Spring 可以自动扫描并实例化它。
切入点表达式
Pointcut(annotation(com.example.demo.MyTestAnnotation))这是一个切入点Pointcut定义用于指定这个切面要拦截的操作。这里的切入点表达式表示拦截所有被 MyTestAnnotation 注解标记的方法。
通知方法
public void myAnnotationPointCut() {}这是一个空方法被上面的 Pointcut 标注用来定义切入点逻辑。
前置通知
Before(myAnnotationPointCut())这是一个前置通知表示在切入点 myAnnotationPointCut 指定的方法即被 MyTestAnnotation 注解的方法执行之前运行这个通知方法。public void before(JoinPoint joinPoint) throws Throwable {...}这是实际执行的前置通知方法。在这个方法中可以获取到被拦截方法的签名、参数等信息并且可以执行一些自定义的逻辑。 MethodSignature sign (MethodSignature) joinPoint.getSignature();获取方法签名。Method method sign.getMethod();获取具体的方法对象。MyTestAnnotation annotation method.getAnnotation(MyTestAnnotation.class);获取方法上的 MyTestAnnotation 注解。System.out.print(打印TestAnnotation 参数 annotation.value());打印注解的参数值。
这段代码的作用是在 Spring AOP 环境下拦截所有使用了 MyTestAnnotation 注解的方法并在这些方法执行之前打印出注解的参数值。这种机制可以用来做很多有趣的事情比如 日志记录、权限检查、性能监控 等极大地增强了代码的灵活性和可维护性。
2.3 使用自定义注解
在需要使用的地方使用自定义注解直接添加注解名即可见以下代码
package com.example.demo;import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;RestController
EnableAspectJAutoProxy
public class TestController {RequestMapping(/)MyTestAnnotation(测试Annotation)public void testAnnotation() {System.err.println(测试自定义注解);}}运行上面代码输出如下结果