元注解

元注解

元注解时定义注解的注解,是Java提供的用于定义注解的基本注解

注解 说明
@Retention 是注解类,实现声明类Class,声明类别Category,声明扩展Extension
@Target 放在自定义注解上的上边,表明该注解可以使用的范围
@Inherited 允许子类继承父类的注解,在子类中可以获取使用父类注解
@Documented 表明这个注解是由Javadoc记录的
@interface 用来定义注释类型

1.@Target
该注解的作用是告诉Java将自定义的注解放在什么地方,比如类、方法、构造器、变量上等。它的值是一个枚举类型,有如下属性值。

属性 含义
ElementType.CONSTUCTOR 用于描述构造器
ElementType.FIELD 用于描述成员变量、对象、属性(包括enum实例)
ElementType.LOCAL_VARIABLE 用于描述局部变量
ElementType.METHOD 用于描述方法
ElementType.PACKAGE 用于描述包
ElementType.PARAMETER 用于描述参数
ElementType.TYPE 用于描述类、接口(包括注解类型)或enum声明

2.@Retention
该注解用于说明自定义注解的生命周期,在注解中有三个生命周期

生命周期 含义
RententionPolicy.RUNTIME 始终不会丢弃,运行期也保留该注解,可以使用发射机制读取该注解的信息。自定义的注解通常使用这种方法
RetentionPolicy.CLASS 类加载时丢弃,默认是这种方式
RetentionPolicy.SOURCE 编译阶段丢弃,自定义注解在编译结束之后就不在有意义,所以它们不会写入字节码。@Override和@SuppressWarnings都属于这类注解

3.@Inherited
该注解是一个标记注解,表明被标注的类型是可以被继承的。如果一个使用了@Inherited修饰的Annotation类型被用于一个Class,则这个Annotation将被用于该Class的子类。

4.Documented
该注解表示是否将注解信息添加在Java文档中

5 @Interface
该注解用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过default来声明参数的默认值。

定义注解格式

public @interface 注解名 {定义体}

自定义注解

实验结果:打开网址,网页内容为空

http://localhost:8080/lishizheng

控制台输出如下结果

TestAnnotation 参数: 测试Annotation参数
测试自定义注解

项目结构
在这里插入图片描述
0添加依赖
pom.xml
由于使用AOP方式,需要添加如下依赖

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

1.创建自定义注解类

MyTestAnnotation.java
代码解释

  • 使用@Target注解标注作用范围
  • 使用@Retention注解标注生命周期
  • 使用@Documented将注解信息添加在Java文档中
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();
}

2.实现业务逻辑
以AOP方式实现业务逻辑
TestAnnotationAspect.java

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.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import org.springframework.stereotype.Component;

import java.lang.invoke.MethodHandle;
import java.lang.reflect.Method;
@Aspect
@Component

public class TestAnnotationAspect {
    //拦截被MyTestAnnotation注解的方法;如果需要拦截指定包指定规则名称的方法,则可以使用表达式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.println("TestAnnotation 参数: "+annotation.value());
    }
}


3.使用自定义注解
在需要使用的地方使用自定义注解,直接添加注解名

TestController.java

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("/lishizheng")
    @MyTestAnnotation("测试Annotation参数")
    public void testAnnnotation(){
        System.out.println("测试自定义注解");
    }

}

热门文章

暂无图片
编程学习 ·

vue打包后修改服务器地址

1.在public文件下新建config.js文件2.修改config.js文件 var PLATFROM_CONFIG = {}; // 本地环境 PLATFROM_CONFIG.baseUrl = "服务器地址" // 正式环境 // PLATFROM_CONFIG.baseUrl = "服务器地址"3.在封装好的axios里面去修改,我的是4.在index.html中引…
暂无图片
编程学习 ·

python学习记录

变量和简单数据类型 message="Hello Python world!" print(message)message就是一个变量,绿色部分用双引号括起来的(也可以用单引号)就是一个字符串。变量的命名和使用: 1.变量名只能包含字母、数字和下划线。字母下划线可以打头数字不可以。 2.变量名不能包含空…
暂无图片
编程学习 ·

3.1.2 Jsoup请求URL

org.jsoup.Jsoup类可以用来处理连接操作。在org.jsoup.Jsoup类中提供了connect(String url)方法来创建一个新连接,该方法的实现依赖于Java网络通信包java.net。在创建连接之后,可通过具体请求方法(GET或POST等)获取URL对应的HTML文件。 如需要采集某页面中的文本内容。首先,…
暂无图片
编程学习 ·

活动目录的备份和恢复

活动目录的备份和恢复AD的备份和恢复AD回收站说明启用回收站功能演示AD回收站AD活动目录的备份和还原AD活动目录的备份安装Windows Server Backup工具添加角色和功能开始之前-安装类型-服务器选择-服务器角色,默认下一步功能确认结果开始备份AD活动目录AD活动目录的恢复重启按…
暂无图片
编程学习 ·

springboot应用启动流程分析,嵌入式tomcat

之前我们分析了下springboot自动装载的原理,现在我们看看springboot应用启动的流程: 一般调用如下: // 应用代码SpringApplication.run(MiddlewareApplication.class, args); // SpringApplication.javapublic static ConfigurableApplicationContext run(Class<?> p…
暂无图片
编程学习 ·

文本生成评价指标的进化与推翻

文章目录前言基于词重叠率的方法机器翻译 & 摘要 常用指标BLEUROUGENISTMETEORTERdata to text 常用指标relation generation (RG)content selection (CS)content ordering (CO)如何实现上述的评价指标CoverageDistinctimage caption 常用指标CIDEr好处SPICE词向量评价指标…
暂无图片
编程学习 ·

LeetCode题解(0762):二进制表示中质数个计算置位(Python)

题目:原题链接(简单)解法 时间复杂度 空间复杂度 执行用时Ans 1 (Python) O(N)O(N)O(N) O(1)O(1)O(1) 200ms (99.05%)Ans 2 (Python)Ans 3 (Python)LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,执行用时一般都在同一个量级,仅作参考意义。解法一:【思路】…
暂无图片
编程学习 ·

POM 标签大全详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"><!--父项目的坐标。…
暂无图片
编程学习 ·

Zabbix简介

一、Zabbix介绍 Zabbix是一个企业级的、开源的、分布式的监控套件 Zabbix可以监控网络和服务的监控状况. Zabbix利用灵活的告警机制,允许用户对事件发送基于Email的告警. 这样可以保证快速的对问题作出响应. Zabbix可以利用存储数据提供杰出的报告及图形化方式. 这一特性将帮助…
暂无图片
编程学习 ·

希尔排序的原理,图解,java代码实现

希尔排序希尔排序就是一种插入排序,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。排序原理排序原理:选定一个增长量h,按照曾长亮h作为分组的依据,对数据进行分组。 对分好组的每一组数据完成插入排序。 减少增长量,最小减为1,重复第二步操作。举例排序过…
暂无图片
编程学习 ·

VS2013编译通过但代码中有红色波浪线

问题描述:VS2013编译无问题但代码中有许多红色下划波浪线解决方案: 1、有些博客分享的方法是:项目属性->c/c++ ->常规->附加包含目录->添加包含代码文件夹的根目录;再填入:$(ProjectDir) 这个方法我没有改成功 2、最后用这个方法解决的:点击上方工具栏的工具…
暂无图片
编程学习 ·

goroutine的调度

goroutine的调度一、goroutine简介二、goroutine内部原理调度模型简介调度实现 一、goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心。 goroutine使用方式非常的简单,只需使用go关键字即可启动一个协程,并且它…
暂无图片
编程学习 ·

HCL实验8:NAT搭建私有网络

NAT 通过NAT技术,进行私有网络的搭建 拓扑图先对路由器的端口进行配置 R1 [H3C]sys R1 [R1]INT G0/0 [R1-GigabitEthernet0/0]ip address 192.168.56.1 24 [R1-GigabitEthernet0/0]undo shutdown [R1-GigabitEthernet0/0]quit [R1]int s1/0 [R1-Serial1/0]ip address 100.100.…
暂无图片
编程学习 ·

2.2.1String字符串

字符串比较equals():s1.equals(s2); equalsIgnoreCase():忽略大小写比较。去首尾空白字符 trim():" \tHello\r\n ".trim(); // "Hello" 替换子串根据字符或字符串替换:String s = "hello"; s.replace(l, w); // "hewwo",所有字符l…
暂无图片
编程学习 ·

HTTP Header (请求头&响应头)

1. 关于HTTP消息头HTTP消息头是在,客户端请求(Request)或服务器响应(Response)时传递的,位请求或响应的第一行,HTTP消息体(请求或响应的内容)是其后传输。HTTP消息头,以明文的字符串格式传送,是以冒号分隔的键/值对,如:Accept-Charset: utf-8,每一个消息头最后以…
暂无图片
编程学习 ·

JavaScript按位运算符

按位运算符将其操作数当做32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。 我们主要了解的有七种,分别是:&、|、^、~、<<、>>、>>>。 按位与运算符 按位与 & 运算符,对两个 32 位表达式的每一位执行按位与运算。如果a 和…