SpringBoot之自定义注解

news2024/11/18 23:28:56

目录

1.java注解简介

        1.1.java注解分类

               1.1.1.JDK基本注解

               1.1.2.JDK元注解

               1.1.3.自定义注解

               1.1.4 在这里如何自定义注解?

2、自定义注解

3.Aop应用自定义注解


1.java注解简介

Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能

        1.1.java注解分类

               1.1.1.JDK基本注解

@Override
重写

@SuppressWarnings(value = "unchecked")
压制编辑器警告


               1.1.2.JDK元注解

@Retention:定义注解的保留策略
@Retention(RetentionPolicy.SOURCE)             //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)              //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)            //注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)
@Target(ElementType.TYPE)                      //接口、类
@Target(ElementType.FIELD)                     //属性
@Target(ElementType.METHOD)                    //方法
@Target(ElementType.PARAMETER)                 //方法参数
@Target(ElementType.CONSTRUCTOR)               //构造函数
@Target(ElementType.LOCAL_VARIABLE)            //局部变量
@Target(ElementType.ANNOTATION_TYPE)           //注解
@Target(ElementType.PACKAGE)                   //包
注:可以指定多个位置,例如:
@Target({ElementType.METHOD, ElementType.TYPE}),也就是此注解可以在方法和类上面使用

@Inherited:指定被修饰的Annotation将具有继承性

@Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档.


               1.1.3.自定义注解

注解分类(根据Annotation是否包含成员变量,可以把Annotation分为两类):

标记Annotation:
没有成员变量的Annotation; 这种Annotation仅利用自身的存在与否来提供信息

元数据Annotation:
包含成员变量的Annotation; 它们可以接受(和提供)更多的元数据

                 1.1.4 在这里如何自定义注解?

                使用@interface关键字, 其定义过程与定义接口非常类似, 需要注意的是:Annotation的成员变量在Annotation定义中是以无参的方法形式来声明的, 其方法名和返回值类型定义了该成员变量的名字和类型,而且我们还可以使用default关键字为这个成员变量设定默认值

2、自定义注解

@interface 注解修饰符

如果属性是value的话,可以省略value=;如果是其他,则不可以省略

 Myannotation1 :

package com.zwc.ssm.annotation;
 
import javax.swing.*;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//(接口|类,方法,属性)决定此注解可以修饰什么内容
@Retention(RetentionPolicy.RUNTIME)
//注解修饰符 @interface
public @interface MyAnnotation1 {
 
    //注解中属性
    //如果属性是value的话,可以省略value=,其他的属性不行
    public String value() default "可以修饰属性,类,方法";
    public String desc() default "可以修饰属性,类,方法";
 
 
}

MyAnnotation2

package com.zwc.ssm.annotation;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
//注解修饰符 @interface
public @interface MyAnnotation2 {
 
    //注解中属性
    //如果属性是value的话,可以省略value=,其他的属性不行
    public String value() default "可以修饰属性,类,方法";
    public String desc() default "可以修饰属性,类,方法";
 
 
}

启用注解StudentController,下类作于自定义注解

package com.zwc.ssm.annotation;
 

@MyAnnotation1(desc = "标记在类上面")
public class StudentController {
 
    @MyAnnotation1("标记在属性id上面")
    private String id;
    @MyAnnotation1("标记在name上面")
    private String name;
 
    @MyAnnotation1
    public void test1(@MyAnnotation2("用来修饰id参数") String id,@MyAnnotation2("用来修饰name参数") String name){
        System.out.println("测试");
    }
 
}

测试获取注解中的值

Demo:

package com.zwc.ssm.annotation.demo;
 
import com.zwc.ssm.annotation.MyAnnotation1;
import com.zwc.ssm.annotation.MyAnnotation2;
import com.zwc.ssm.annotation.StudentController;
 
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
 
/**
 *
 * 目标
 * 1:获取studentControler 类上自定义注解 中的内容
 * 2:获取studentControler 方法上自定义注解 中的内容
 * 3:获取studentControler 属性上自定义注解 中的内容
 */
public class Demo1 {
    public static void main(String[] args) throws Exception {
        MyAnnotation1 annotation = StudentController.class.getAnnotation(MyAnnotation1.class);
 
        //获取类上自定义注解中的内容
        System.out.println(annotation.value());
        System.out.println(annotation.desc());
 
 
        //获取属性上自定义注解中的内容
        Field id = StudentController.class.getDeclaredField("id");
        Field name = StudentController.class.getDeclaredField("name");
        System.out.println(id.getAnnotation(MyAnnotation1.class).value());
        System.out.println(name.getAnnotation(MyAnnotation1.class).value());
 
        //获取方法上自定义注解中的内容
        Method m1 = StudentController.class.getDeclaredMethod("test1", String.class, String.class);
        System.out.println(m1.getAnnotation(MyAnnotation1.class).value());
 
        //获取参数上自定义注解中的内容
        for (Parameter p : m1.getParameters()) {
            System.out.println(p.getAnnotation(MyAnnotation2.class).value());
        }
    }
}

结果: 

3.Aop应用自定义注解

aop应用自定义注解:

        自定义注解的介入,可以在使用注解的地方,才触发aop切面

MyLog:

package com.zwc.ssm.annotation.aop;
 
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 Mylog {
    String desc();
}

DemoController

package com.zwc.ssm.annotation.aop;
 
import org.springframework.stereotype.Controller;
 

@Controller
public class DemoController {
    @MyLog(desc="这是一个测试类的方法")
    public void test(){
        System.out.println("测试方法");
    }
}

切面类

MyLogAspect 

package com.zwc.ssm.annotation.aop;
 
import org.aspectj.lang.JoinPoint;
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;
 
@Component
@Aspect
public class MyLogAspect {
    private static final Logger logger = LoggerFactory.getLogger(MyLogAspect.class);
 
    /**
     * 只要用到了com.javaxl.p2.annotation.springAop.MyLog这个注解的,就是目标类
     */
    @Pointcut("@annotation(com.zking.ssm.annotation.aop.MyLog)")
    private void MyValid() {
 
    }
 
    @Before("MyValid()")
    public void before(JoinPoint joinPoint) {
//        JoinPoint
//        可以获取到目标对象,目标方法,传递参数
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        logger.debug("[" + signature.getName() + " : start.....]");
        System.out.println("[" + signature.getName() + " : start.....]");
 
        MyLog myLog = signature.getMethod().getAnnotation(MyLog.class);
        logger.debug("【目标对象方法被调用时候产生的日志,记录到日志表中】:"+myLog.desc());
        System.out.println("【目标对象方法被调用时候产生的日志,记录到日志表中】:" + myLog.desc());
    }
}

测试类

AnnotationTest 

package com.zwc.shiro;
 
import com.zwc.ssm.annotation.aop.DemoController;
import com.zwc.ssm.annotation.demo.Demo1;
import com.zwc.ssm.biz.ClazzBiz;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class AnnotationTest {
    @Autowired
    private DemoController demoController;
 
    @Test
    public void test1(){
        demoController.test();
    }
 
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可靠性udp传输大文件

高级计算机网络大作业-可靠性udp传输大文件实验数据zstd压缩1G文件(延迟100ms、丢包1%)0.1G文件(延迟100ms、丢包1%)0.01G文件(延迟100ms、丢包1%)多线程lzma压缩1G文件(延迟100ms、丢包1%&…

N子棋(外加双人对战)详解!推荐!!!

文章目录准备工作创建菜单进入游戏初始化棋盘、打印棋盘玩家下棋、电脑下棋、生成随机数判断输赢大家好!时隔多天,我终于写博客了,真的是开心!这一次带来的是N子棋有双人对战和单人下棋,请认真看下去,我会竭…

虚拟人纷纷「出道」,社交泛娱乐场景如何迎接新顶流?

⬆️“政企数智办公行业研究报告及融云新品发布会”明天直播! 本月 12 日,花房集团即将于香港上市。关注【融云全球互联网通信云】回复【融云】抽取高颜值大容量高端可乐保温杯哦~ 中国政企数智办公平台 在带货直播平台的赫赫之名下,娱乐直播…

Git —— 那些在工作中日常使用的操作

Git —— 那些在工作中日常使用的操作 《工欲善其事,必先利其器》—— 既然点进来了,麻烦你看下去,希望你有不一样的收获~ 一、同一项目关联不同平台的远程仓库 格式:git remote add 命名 仓库链接 git remote add github ssh:/…

六、排序算法介绍2

1、冒泡排序 1.1 基本介绍 冒泡排序(Bubble Sorting) 的基本思想是: 通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值, 若发现逆序则交换, 使值较大的元素逐…

netcore接入钉钉扫码登录

netcore接入钉钉扫码登录一、首先官方文档预览二、登录钉钉开发者后台三、创建第三方登录授权应用1.新版打开方式2.旧版打开方式(1)先返回旧版页面(2)选择应用开发(3)编辑登录应用信息(4&#x…

npm包是什么?如何发布npm包?

Node的组成 内置模块 自定义模块 第三方模块(什么是包?) npm包包括那些东西? package.json README.md 。。。.js 注册npm账号 细节 发布包 package.json README.md index.js date htmlEscape 层级结构 发布指令 N…

STC15 - C51 - Memory Models

文章目录STC15 - C51 - Memory Models概述笔记内存用量的优化思路ENDSTC15 - C51 - Memory Models 概述 在STC上测试呢, 想看看变量(不同类型的定义)被编译器分配在哪个内存范围(idata, pdata, xdata)? 同时, 总结一下降低内存用量的思路(如果像上位机那样内存管够, 就不用考…

Linux系统编程第五节——进程创建、终止、等待(通俗易懂快速上手版本)

目录 进程的创建 写时拷贝 进程的终止 进程的等待 状态参数status wait函数和waitpid函数 我们本节内容,主要来讲述进程控制有关的内容。 同样,我们会用通俗易懂、不同于教科书的讲授思路,来为大家讲解。 同时,本节内容板块…

你了解你的身体吗?- 基因社会

关于作者 本书的两位作者分别是以太•亚奈和马丁 • 菜凯尔,前者是哈佛大学髙级研究学者, 任职于纽约大学,是生物化学和分子药理 学的教授;后者是杜塞尔多夫海因西里•海 涅大学的生物信息学教授。两位作者从基 因之间合作和竞争…

[附源码]计算机毕业设计的4s店车辆管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

5款十分好用,但是没有什么知名度的软件

随着网络信息技术的发展,越来越多的人在办公时需要用到电脑了。如果你想提高办公效率,那么就少不了工具的帮忙,今天给大家分享5款办公必备的好软件。 1.数据可视化软件——Power BI Power BI是一款出色的业务分析软件。Power BI主要是用于在…

[Go] go基础4

1. 并发编程 1.1 并发和并行 并发: 多个线程在同个核心的CPU上运行.并发的本质是串行. 并行: 多个线程在多个核心的CPU上运行. 1.2 协程和线程 协程: 独立的栈空间,共享堆空间,调度由用户控制,本质上有点类似用户及线程,这些用户及线程的调度也是自己实现的. 线程: 一个线…

[附源码]JAVA毕业设计网络饮品销售管理系统(系统+LW)

[附源码]JAVA毕业设计网络饮品销售管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

全新社交电商模式来袭,消费增值结合共享经济完成消费升级

大家好,我是林工,不知道大家是否了解消费增值?这是一个消费储量为基础的理念,体现的是消费者的消费与回报问题,普遍的消费返利,消费全返渐渐地已经不能够满足目前的客户,也就有了一个满足与这部…

【嵌入式硬件芯片开发笔记】4-20mA DAC芯片AD5421配置流程

【嵌入式硬件芯片开发笔记】4-20mA DAC芯片AD5421配置流程 16位、串行输入、环路供电、4 mA至20 mA DAC 可用于HART协议相关电路 同AD5700配合使用 AD5421的SPI和普通的不一样 回读时要发两段 CS中间拉高一次 数据在SCLK上升沿逐个输出,而且在 SCLK下降沿有效 固CP…

使用方法丨艾美捷Caspase-1活性分析试剂盒介绍

如何动态检测活细胞内的Caspase-1的活性,做更真实的实验?艾美捷推荐Immunochemistry Tech(ICT)的FLICA系列科研工具,轻松检测活细胞Caspase-1 活性。 艾美捷Immunochemistry Caspase-1活性分析试剂盒原理&#xff1a…

Qt第三十四章:总结【隐藏标题栏边框、隐藏背景、窗体透明】

目录 隐藏标题栏边框 ①隐藏标题栏代码: ​编辑②自定义标题栏(可以直接Copy) 使用 隐藏背景 ①隐藏背景代码,此时背景上的样式都是无效的。 ②自定义背景,通过重写paintEvent事件来完成 中间绘制的部分是我们想要的,只需要将标题栏边框隐藏掉就可…

五、卷积神经网络CNN5(图像卷积与反卷积)

图像卷积 首先给出一个输入输出结果那他是怎样计算的呢? 卷积的时候需要对卷积核进行 180 的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下:这样计算出左上角(即第…

【畅购商城】内网穿透之EchoSite

目录 概述 注册用户 抢注域名 ​​​​​​​下载客户端 ​​​​​​​编写配置文件 ​​​​​​​启动 ​​​​​​​访问 ​​​​​​​概述 EchoSite一款收费的内网映射工具(已下架) 花生壳:内网穿透工具,免费版…