【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对象使用,以及如何定义注解在 自己的项目中使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/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 使用…
最新文章