spring自定义注解

Annotation

  1. 注解不是程序本身,但是可以对程序做出解释
  2. 注解可以被其他程序(比如:编译器)读取

Java注解分类

  • 基本注解

    • @Override
      重写@SuppressWarnings(value = "unchecked")
      压制编辑器警告
  • 元注解

  • 自定义注解

元注解

元注解的作用就是负责注解其他注解

  1. @Target:描述注解的使用位置
    1. @Target(ElementType.TYPE) //接口、类
    2. @Target(ElementType.FIELD) //属性
    3. @Target(ElementType.METHOD) //方法
    4. @Target(ElementType.PARAMETER) //方法参数
    5. @Target(ElementType.CONSTRUCTOR) //构造函数
    6. @Target(ElementType.LOCAL_VARIABLE) //局部变量
    7. @Target(ElementType.ANNOTATION_TYPE) //注解
    8. @Target(ElementType.PACKAGE) //包
    9. 注:可以指定多个位置,例如:@Target({ElementType.METHOD, ElementType.TYPE}),也就是此注解可以在方法和类上面使用
  2. @Retention:描述注解的生命周期,表示在什么级别保存该注解的信息(3个取值:SOURCE<CLASS<RUNTIME)
    1. @Retention:定义注解的保留策略
    2. @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
    3. @Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
    4. @Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到
  3. @Document:说明该注解可以被生成在Javadoc中
  4. @Inherited:指定被修饰的Annotation将具有继承性,说明子类可以继承父类中的该注解

其中最重要的

@Retention(RetentionPolicy.RUNTIME)
@Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)

自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@MyAnnotation(name = "张三")
class Demo {@MyAnnotation(name = "张三", age = 100)public static void main(String[] args) {}
}// @Target:描述该注解可以在什么地方使用
@Target({ElementType.TYPE, ElementType.METHOD})
// @Retention:描述注解的生命周期,该注解在哪个基表生效(3个取值:SOURCE<CLASS<RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
// 定义一个注解
@interface MyAnnotation {String name();int age() default 1;
}

项目中spring集成自定义注解实现日志记录功能

1、自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 1、自定义注解*/
@Target(ElementType.METHOD) // 在方法上
@Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
public @interface PrintLog {String desc();String name() default "张三";
}
2、定义切面类
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.util.Arrays;
import java.util.List;/*** 2、定义切面类*/
@Component
@Aspect
public class MyLogAspect {/*** 只要用到了com.javaxl.p2.annotation.springAop.MyLog这个注解的,就是目标类*/@Pointcut("@annotation(com.nankang.institution.ann.PrintLog)")private void MyValid() {}@Around("MyValid()")public void around(ProceedingJoinPoint pjp) throws Throwable {try {System.out.println("==================1、切面类环绕通知开始==================");Object proceed = pjp.proceed();System.out.println("5、执行方式,这里是方法返回的数据" + proceed);System.out.println("==================6、环绕通知结束==================");} catch (Exception e) {System.out.println("==================切面类环绕通知异常==================");} finally {System.out.println("==================7、切面类环绕通知异常finally==================");}}@Before("MyValid()")public void before(JoinPoint joinPoint) {System.out.println("==================2.1、切面类前置通知开始==================");MethodSignature signature = (MethodSignature) joinPoint.getSignature();System.out.println("2.2、获取签名信息=>获取当前方法名" + signature.getName());PrintLog printLog = signature.getMethod().getAnnotation(PrintLog.class);//System.out.println("连接点方法为:" + signature.getName() + ",参数为:" + joinPoint.getArgs() );System.out.println("2.3、获取自定义注解信息=》" + printLog.desc());System.out.println("==================2.4、切面类前置通知结束==================");}@After("MyValid()")public void after() {System.out.println("==================4、切面类这是最终通知==================");}@AfterReturning("MyValid()")public void afterReturning(JoinPoint joinPoint) {System.out.println("==================3、切面类后置通知==================");}/*通过throwing属性指定连接点方法出现异常信息存储在ex变量中,在异常通知方法中就可以从ex变量中获取异常信息了*/@AfterThrowing(value="MyValid()",throwing="ex")public void afterReturning(JoinPoint point, Exception ex){String methodName = point.getSignature().getName();List<Object> args = Arrays.asList(point.getArgs());System.out.println("连接点方法为:" + methodName + ",参数为:" + args + ",异常为:" + ex);//连接点方法为:issue,参数为:[{oldhouseid=111 dwell=[]}}],异常为:java.lang.RuntimeException: 123System.out.println("==================异常通知,在目标方法抛出异常后执行==================");}}
3、定义目标方法
@PostMapping("/issue")
@PrintLog(desc = "这是打印日志描述")
public Object issue(@RequestBody Map<String,Object> param) throws Exception {//if(true){//    throw new RuntimeException("123");//}System.out.println("================================这是方法中打印的数据================================");return "这是方法中返回的数据";
}
4、调用后返回数据
==================1、切面类环绕通知开始==================
==================2.1、切面类前置通知开始==================
2.2、获取签名信息=>获取当前方法名issue
2.3、获取自定义注解信息=》这是打印日志描述
==================2.4、切面类前置通知结束==================
================================这是方法中打印的数据================================
==================3、切面类后置通知==================
==================4、切面类这是最终通知==================
5、执行方式,这里是方法返回的数据这是方法中返回的数据
==================6、环绕通知结束==================
==================7、切面类环绕通知异常finally==================

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day1 QT

作业 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口大小this->resize(1025,533);//固定窗口大小this->setFixedSize(1025,533);//设置窗口背景色,设置弧度//this->setStyleSheet("background-image:url(E:/…

肖扬老师好书《微权力下的项目管理(第3版)》读书笔记1

肖扬老师好书《微权力下的项目管理&#xff08;第3版&#xff09;》&#xff0c;的确不错&#xff0c;分别共读之。 第2章 精华 为了在项目过程中成为一名优秀的导演&#xff0c;项目经理要同时修炼领导和管理这两种不同的能 力&#xff0c;因为项目管理模式就是一种游走于领导…

计算机网络知识点复习——TCP协议的三次握手与四次挥手(连接与释放)

TCP协议的三次握手与四次挥手&#xff08;连接与释放&#xff09; 一、前言二、简单的知识准备1. TCP协议的主要特点2. TCP报文段 三、TCP连接的建立&#xff08;三次握手&#xff09;四、TCP连接的释放&#xff08;四次挥手&#xff09;五、TCP连接与释放的总结六、结束语 一、…

MySQL record 01 part

更改密码&#xff1a; alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意&#xff1a; 在命令行方式下&#xff0c;每条MySQL的命令都是以分号结尾的&#xff0c;如果不加分号&#xff0c;MySQL会继续等待用户输入命令&#xff0c;直到MyS…

vue2-elementUI-初始化启动项目-git

前置基础 资料下载-阿里云盘 vueaxioselement-uinpmvscode 初始化项目 1.创建vue2工程 1.1 vue create projectName1.2 选择 1.3 初始化 vue-cli 的核心步骤&#xff1a; Manually select features (*) Babel ( ) TypeScript ( ) Progressive Web App (PWA) Support …

【深度学习讲解笔记】前言

小编为AI专业的本科学生&#xff0c;最近入手了一本《深度学习讲解》的书&#xff0c;由于封面画了苹果&#x1f34e;&#xff0c;所以也叫苹果书&#xff0c;这本书目前在全网的热度很高。 本书是根据李宏毅老师讲授的《机器学习》课程编写的&#xff0c;作者是来自DataWhale…

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点&#xff1a; 鼠标左键双击&#xff0c;设定红色的起点。左键双击设定起点&#xff0c;用红色标记。 设定终点&#xff1a; 鼠标右键双击&#xf…

Uniapp基于uni拦截器+Promise的请求函数封装

最近在学Uniapp&#xff0c;到封装请求的时候本来还想用axios&#xff0c;但是看到一些教学视频有更简单的方法&#xff0c; 基于uni的拦截器和Promise封装的请求函数 但是他们是用TS写的&#xff0c;还没学到TS&#xff0c;我就把JS写了&#xff0c;最终也是请求成功 // src/…

电动机制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

电动机制造5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。5G智能工厂与物联数字孪生平台的融合应用&#xff0c;为电动机制造业的数字化转型铺设了一条高速通道。这一创新模式不仅极大地提升了生产效率&#xff0c;还深刻改变了产品的设计、生产、管理及运…

EasyExcel模板导出与公式计算(下)

目录 环境要求 功能预览 需求分析 导入依赖 制作模板 编写代码 格式优化 最终效果 总结 在上一篇 EasyExcel模板导出与公式计算&#xff08;上&#xff09;-CSDN博客 文章中我们知道了在若依中使用自带的Excel注解来实现表格数据的导出&#xff0c;并且通过重写相关接…

【Python 千题 —— 算法篇】无重复字符最长子段

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在编程过程中&#xff0c;处理字符串的任务时常遇到&#xff0c;其中一个经典问题是查找无重复字符的最长子串。这在很多应用场景中…

redisson中的分布式锁

我的博客大纲 我的后端学习大纲 a.redisson概述&#xff1a; 1.Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;2.redisson介绍官方文档地址&#xff1a;3.Redisson它不仅提供了一系列的分布式的Java常用对象&#xff0c;还…

使用vscode编辑matlab完美解决方法

vscode里面的matlab插件都不好用&#xff0c;需要搭配互补一下 1先安装MATLAB 这个插件可以进行代码高亮、格式化、跳转&#xff0c;F5运行所有代码&#xff0c;或者选中要运行的代码&#xff0c;右键单独运行&#xff0c; 优点&#xff1a;运行速度很快&#xff0c;和matlab里…

vcruntime140.dll丢失报错处理及dll下载修复方法

概述 vcruntime140.dll是Visual C Redistributable for Visual Studio的一个动态链接库文件。 如果你在运行某个程序时遇到了vcruntime140.dll丢失的错误&#xff0c;你可以尝试以下解决方法&#xff1a; 重新安装程序&#xff1a; 如果你只在运行某个特定程序时出现了该错误…

云手机怎样简化海外社媒平台运营

随着越来越多的卖家希望拓展海外市场&#xff0c;运营TikTok、Facebook等社交媒体平台已经成为吸引流量和促进销售的重要手段。然而&#xff0c;在管理海外社媒账号的过程中&#xff0c;许多人会面临网络连接的问题。这时&#xff0c;使用一款高效便捷的云手机工具就显得尤为便…

心理辅导新篇章:Spring Boot学生评估系统

1 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时间变得更加地宝贵化&#xff0c;因为每天的…

JavaScript 循环控制语句-break和continue

break循环 首先i0&#xff0c;判断i是否<5,满足条件&#xff0c;判断i是否等于3&#xff0c;i不等于3&#xff0c;输出i0&#xff0c;i的值加1&#xff0c;判断i是否<5&#xff0c;判断i是否等于3&#xff0c;i不等于3&#xff0c;输出i1&#xff0c;i的值加1&#xff0c…

高精度加法,减法,乘法,除法

加法&#xff1a; 大整数该如何储存&#xff1f; 用数组储存&#xff1a; 把个位放在数下标为0的位置&#xff0c;十位放在数组下标为1的位置&#xff08;也就是高位放在数组的后面&#xff09; 因为这样&#xff0c;如果需要增加一位最高位&#xff0c;那我们就可以直接在…

前端基础 | HTML基础:HTML结构,HTML常见标签

文章目录 HTML1、HTML结构1.1HTML标签1.1.1标签1.1.2标签含义 1.2HTML文件基本结构1.3标签层次结构1.4 快速生成代码框架 2、HTML常见标签2.1注释标签2.2标题标签&#xff1a;h1–h62.3段落标签&#xff1a;p2.4 换行标签&#xff1a;br2.5格式化标签2.6 图片标签&#xff1a;i…

git submodule子模块的使用

子模块的使用 添加子模块 添加子模块 git submodule add <子仓库URL> <子仓库路径> 例子&#xff1a; git submodule add http://192.168.100.181/guideir/poco.git 3rdparty/poco 若子模块存在好几个分支&#xff0c;可以在添加子模块时&#xff0c;指定分支 g…