【Java基础】聊聊你不知道的注解那些事

在实际的开发中,我们大量使用了注解,无论是spring、还是本身jdk提供的,注解都是围绕一个java程序员的开发生活,所以本篇主要介绍注解相关的概念、理论、实践。

定义注解

注解和异常非常相似,都可以自定义,但是我们自定义异常的场景比较多,但是注解就比较少。
overrider是本身jdk提供的,表示当前方法被覆盖的描述。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

我们自定义一个限流注解。

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

    public enum TimeUnit {SECOND,MINUTE,HOUR,DAY,MONTH}

    String apiName();

    int limitCount();

    TimeUnit timeUnit() default TimeUnit.SECOND

}

target

target用来描述注解的使用范围,

public enum ElementType {
    TYPE, // 类型 类,接口,枚举
    FIELD, // 用于成员变量
    METHOD, // 用于方法
    PARAMETER, // 用于参数
    CONSTRUCTOR, // 用于构造方法
    LOCAL_VARIABLE, // 局部变量
    ANNOTATION_TYPE, 
    PACKAGE, // 用于包
    TYPE_PARAMETER,
    TYPE_USE
}

一般主要常用的就是针对类、方法、成员变量。实际上注解只是一个标识作用。可以通过反射访问的代码元素,我们都可以通过注解标识。如果不使用target标识使用范围,默认就是做任何范围。

Retention

描述注解的可见范围,生命周期。

public enum RetentionPolicy {
    SOURCE, // 源码中可见
    CLASS, 
    RUNTIME
}

SOURCE代表仅在源码中可见,当编译器将源代码编译为字节码后,注解信息将被丢弃。不过编译器可以在可见范围内查找,比如override 查找其父类是否有对应的方法,没有就编译错误。class标识在字节码范围。runtime标识在运行时期。
源码->编译->运行时。

Documented

标识在java doc中进行输出

interface

class 代表类 interface 代表接口、enum代表枚举类、@interface代表注解。

标记注解

标记注解,其实就是使用不同的注解,放在方法或者类上。

    @RateLimit(apiName = "/user/info",limitCount = 1000,
            timeUnit = RateLimit.TimeUnit.SECOND)
    public void getUserInfo() {   
    }

读取注解

定义注解、标记注解,还需要进行读取注解,也就是说需要通过响应逻辑的代码处理。对于java内建注解,编译器和JVM都可以对其进行读取和处理,比如override注解,编译器在编译代码时,会读取所有标记了@override的方法,并且检查父类中是否有同名方法。没有就编译报错。

对于自定义注解,需要我们开发相应的读取和处理逻辑,如何来读取代码中的注解信息。就需要使用上一节课中的反射语法。反射其实是作用于代码运行时。

注解应用

最常见的就是 替换配置文件
在这里插入图片描述
spring中配置文件 一般通过xml进行定义,我们可以使用注解替代xml配置
在这里插入图片描述
那么spring容器时如何使用注解的?
在程序启动的时候,spring ioc容器利用反射获取到appConfig配置, 发现包含@configuration注解,便确定这个类时一个配置类。通过反射获取到对应方法的bean对象,并创建对应的对象,存储到一个大map中,key 为beanName value为对象,就可以通过getBean获取对象。
而平时常见的@service、@controller、@respository 都是同样的方式。

应用场景

自定义注解 csv文件
比如在实际的开发中,我们需要对一个对象的字段进行写入到csv文件中,但是有一些字段不想被写入。比如用户的基本信息(ID、name、age、phone、idcardnum、住址信息等),比如针对phone、和idcardnum 需要我们进行脱敏处理。或者忽略不写。 我们可以开发一个自定义注解。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface CsvIgnore {
}
    @CsvIgnore
    private String phone;

通过反射的方式在公共的csv文件操作逻辑进行忽略。这样其实就做到了透明化。使用者其实不用关心。

    CsvIgnore ignoreProperty = field.getAnnotation(CsvIgnore.class);
     if (!Objects.isNull(ignoreProperty)) {
         csvIgnoreSet.add(field.getName());
     }

自定义主从切换
在实际的开发中,我们可能有多个DB要切换操作,比如读取风控数据库、后台数据库、用户数据库等,如何在同一个请求中自定义获取数据源。我们可以通过注解的方式。通过AOP的方式

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSourceHolder {
    DataSource value() default DataSource.SALVE;
}
 @Around("@annotation(dataSourceHolder)")
 public Object enhance(ProceedingJoinPoint joinPoint, DataSourceHolder dataSourceHolder) {
     if (dataSourceHolder.value() == DataSource.MASTER) {
         DynamicDataSourceHolder.setDataSourceTypeMaster();
     } else {
         DynamicDataSourceHolder.setDataSourceTypeSlave();
     }
     Object proceed = null;
     try {
         proceed = joinPoint.proceed();
     } catch (Throwable throwable) {
         throw new RuntimeException(throwable);
     } finally {
         DynamicDataSourceHolder.clearDataSourceType();
     }

     return proceed;
 }

在这里插入图片描述

小结

好了本篇主要详细介绍了java注解的相关使用,原理,关于如何获取注解,需要等下一篇的关于反射的讲解。以后写注解就知道为什么加一个@service就可以被扫描成bean对象使用,以及如何定义注解在 自己的项目中使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CDR绘图软件|安装教程来了(小白福利:有红包封面领取哦!)

前言 今天给小伙伴们讲讲:如何安装CDR软件。 如果未来的你想从事平面设计/广告行业,那应该就会接触到CDR这款软件。 CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件;该软件是Corel公司出品的矢量图形制作工具软件,这…

ShardingSphere之ShardingJDBC客户端分库分表上

目录 什么是ShardingSphere? 客户端分库分表与服务端分库分表 ShardingJDBC客户端分库分表 ShardingProxy服务端分库分表 ShardingSphere实现分库分表的核心概念 ShardingJDBC实战 什么是ShardingSphere? ShardingSphere是一款起源于当当网内部的应…

HubSpot数字化推广:突破传统,拓展创新的边界

在当今数字化时代,营销策略的创新成为企业取得竞争优势的关键。HubSpot作为数字化推广领域的领军者,不断开辟着创新营销之路,引领着数字化推广的新篇章。运营坛今天将深入探讨HubSpot是如何在数字化推广中实现创新,并为企业开启新…

如何在Vue项目中应用TypeScript?

文章目录 一、前言二、使用Componentcomputed、data、methodspropswatchemit 三 、总结 一、前言 与link类似 在VUE项目中应用typescript,我们需要引入一个库vue-property-decorator, 其是基于vue-class-component库而来,这个库vue官方推出…

体验华为云对话机器人服务 CBS

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、开通…

幻兽帕鲁服务器一键搭建脚本

前言 幻兽帕鲁刚上线就百万在线人数。官方服务器的又经常不稳定。所以这里给大家带来最快捷的搭建教程。废话不多说直接开始。 服务器配置要求 这里推荐腾讯云的轻量云服务器 测试环境: CPU : 2核 内存:4GB 系统:Debian 12 64…

nginx反向代理负载均衡

一,kali作为负载服务器 打开kali nginx服务,访问页面如下 使用docker拉取nginx,并做出端口映射 ┌──(root?kali)-[/etc/nginx] └─# docker pull nginx ┌──(root㉿kali)-[/etc/nginx] └─# docker run -p 11111:80 --name Jdr -d ng…

开源模型部署及使用

开源模型部署及使用 1.Langchain-Chatchat1.环境2.运行3.效果 2.facefusion1.环境2.运行3.效果 3.Aquila1.环境2.运行 1.Langchain-Chatchat Langchain-Chatchat这里面可以调用许多模型,我本地下载了chatglm3模型文件,所以就用这个模型。 1.环境 根据…

蓝桥杯(C++ 左移右移 买二增一 松散子序列 填充 有奖问答 更小的数 )

目录 左移右移 思路: 代码: 买二增一 思路: 代码: 松散子序列 思路: 代码: 填充 思路: 代码 : 有奖问答 思路: 代码: 更小的数 思路&#…

Java强训day4(选择题编程题)

选择题 接口中的方法是为了让重写编程题 题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a_b sc.nextInt();int b_c sc.nextInt();int ab sc.nextInt();int bc sc.nextInt();for(in…

面向社交网络语言隐写分析

论文:Linguistic Steganalysis Toward Social Network 发表在:IEEE Transactions on Information Forensics & Security是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊&#xff0c…

Git 删除已经 Push 到远程多余的文件

例如要删除 data/log 文件 1. 在当前项目下打开终端 2. 查看有哪些文件夹 dir 3. 预览将要删除的文件(如果不清楚该目录下是否存在不应该删除的文件) git rm -r -n --cached 文件/文件夹名称 加上 -n 这个参数,执行命令时,是不会…

ubuntu设置右键打开terminator、code

前言: 这里介绍一种直接右键打开本地目录下的terminator和vscode的方法。 一:右键打开terminator 1.安装terminator sudo apt install terminator 2.安装nautilus-actions filemanager-actions sudo apt-get install nautilus-actions filemanager…

Open CASCADE学习|圆柱螺旋线绘制原理探究

1、圆柱螺旋线绘制原理 在OCC中,圆柱面的参数方程为: 设P为(x0,y0,z0),则 xx0r*cos(u) yy0r*sin(u) zz0v 但u、v之间有关系时,此方程表达为圆柱螺旋线,u、v之间为线性关系时是等螺距螺旋线&#xff0…

数位dp,HDU 4151 The Special Number

一、题目 1、题目描述 In this problem, we assume the positive integer with the following properties are called ‘the special number’: 1) The special number is a non-negative integer without any leading zero. 2) The numbers in every digit of the special nu…

Linux基础指令大汇总

Linux的指令比较多,在学习的过程中要学会总结和归纳,同时结合实践多多使用,就像学数学一样,不是背过公式就等于掌握的,而是要知道在什么时候用,怎么用才是关键。 这篇文章会列举一系列常用的指令&#xff0…

springblade框架实现多数据源

文章目录 前言1、 application-dev.yml配置文件2、service层3、修改 spring.datasource.dynamic.enabled 备注总结 前言 公司要求使用springblade框架开发,需要用到多数据源的场景 1、 application-dev.yml配置文件 #数据源配置 spring:datasource:dynamic:primar…

腾讯云服务器一键部署幻兽帕鲁联机服务器详细教程(Linux系统)

腾讯云作为国内领先的云计算服务商,为广大用户提供了稳定、高效的云计算服务。本文将详细介绍如何在腾讯云服务器(Linux系统)实现一键部署幻兽帕鲁联机服务器,帮助大家快速搭建自己的游戏联机服务器。 第一步:购买服务…

初识数据库

数据库技术的基础术语 在学习数据库技术之前,我们先认识与该技术密切相关的基本术语,分别是数据库 (Database, DB)、数据库管理系统(Database Management System, DBMS)和数据库 系统(Database System, DBS),具体介绍如下。 1. 数据库 数…

【Linux install】详细的Ubuntu和win双系统安装指南

文章目录 1.前期准备1.1 制作启动盘1.2关闭快速启动、安全启动、bitlocker1.2.1 原因1.2.2 进入BIOSshell命令行进入BIOSwindows设置中高级启动在开机时狂按某个键进入BIOS 1.2.3 关闭Fast boot和Secure boot 1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小 2.开始安装2.1 使用…