[Java基础] 常用注解
文章目录
1. 元注解
Java元注解是用于注解其他注解的特殊注解,它们可以定义自定义注解的行为和属性。以下是Java中常见的元注解:
-
@Retention:指定该注解会被保留多久。可选值为:RetentionPolicy.SOURCE:注解仅存在于源代码中,在编译时会被丢弃。RetentionPolicy.CLASS:注解在编译时被保留,默认值。但在运行时无法获取。RetentionPolicy.RUNTIME:注解会被保留到程序运行时,可以通过反射机制读取。
-
@Target:指定该注解可以应用于哪些程序元素。例如:ElementType.TYPE:类、接口(包括注解类型)或枚举声明。ElementType.FIELD:字段、枚举常量。ElementType.METHOD:方法。ElementType.PARAMETER:参数。ElementType.CONSTRUCTOR:构造函数。ElementType.LOCAL_VARIABLE:局部变量。ElementType.ANNOTATION_TYPE:注解类型。ElementType.PACKAGE:包声明。
-
@Documented:表示该注解应该被 javadoc 工具记录。默认情况下,注解不会包含在生成的文档中。 -
@Inherited:表示该注解可以被子类继承。如果一个使用了 @Inherited 修饰的注解标注了一个父类,则其子类也自动具有该注解。 -
@Repeatable:表示该注解可以在同一个地方多次出现。从 Java 8 开始支持重复注解。
这些元注解可以帮助开发者更好地控制自定义注解的应用范围和生命周期。
2. 非元注解
2.1 常用JDK自带注解
-
@Override:用于表示一个方法声明打算重写超类中的方法。如果父类的方法名、参数列表或返回值类型不匹配,则编译器将生成错误。 -
@Deprecated:用于表示不建议使用的程序元素,通常是因为存在更好的替代方案或者该元素将在未来的版本中删除。 -
@SuppressWarnings:用于指示编译器抑制特定类型的警告信息,如未使用变量、泛型类型安全等。 -
@SafeVarargs:用于声明方法、构造函数或lambda表达式的调用方保证在可变参数上不会执行不安全的操作,从而避免潜在的运行时异常。 -
@FunctionalInterface:用于标记函数式接口,确保接口只包含一个抽象方法,以便于与Lambda表达式一起使用。 -
@Enable*:如@EnableCaching、@EnableScheduling等,用于开启某些功能的支持。
2.2 常用Spring相关注解
2.2.1 在Spring框架中,注解用于简化配置和增强代码的可读性。以下是常用的Spring注解的一部分
-
@Autowired:用于自动装配依赖,可以应用于构造函数、字段或setter方法。 -
@Component:通用的组件注解,标识一个类为Spring管理的Bean。 -
@Service:标识业务逻辑层的组件,是@Component的特化版本。 -
@Repository:标识数据访问层的组件,通常用于DAO类,也是@Component的特化版本。 -
@Transactional:用于声明事务管理,确保方法在一个事务中执行。 -
@Configuration:标识一个类为配置类,通常用于定义Bean。 -
@Bean:在配置类中定义Bean,替代XML配置。 -
@PostConstruct:标识初始化方法,在依赖注入完成后调用。 -
@PreDestroy: 标识销毁方法,在Bean销毁前调用。 -
@Scheduled:用于定义定时任务。 -
@Value:用于注入属性值,支持SpEL表达式。 -
@Qualifier: 当存在多个相同类型的Bean时,用于指定注入哪个Bean。 -
@Conditional:基于某些条件决定是否注册bean。 -
@Profile:允许你基于profile来启用或禁用组件。 -
@Lazy:懒加载bean。 -
@Scope:定义bean的作用域,如singleton、prototype等。 -
@Primary:当有多个相同类型的bean时,优先选择该bean。 -
@Autowire(required=false):允许自动装配失败时不会抛出异常。 -
@Lookup:用于抽象类中调用具体子类的方法。 -
@Async:用于开启异步执行功能,标注的方法会在独立线程中执行。 -
@Cacheable、@CachePut、@CacheEvict:用于缓存管理,分别表示查询缓存、更新缓存和清除缓存。 -
@EnableAspectJAutoProxy:开启基于 AspectJ 的切面编程支持。 -
@RestControllerAdvice:全局异常处理,结合@ExceptionHandler使用。 -
@Valid、@Validated:用于参数校验。 -
@ConditionalOnProperty、@ConditionalOnClass等:条件装配Bean,根据某些条件决定是否创建Bean。 -
@RefreshScope:用于支持配置的热更新,常用于微服务架构中。 -
@FeignClient:用于声明一个Feign客户端,简化HTTP API的调用。 -
@HystrixCommand:用于定义熔断器逻辑,增强系统的容错能力(适用于使用Hystrix库的情况)。 -
@Retryable:用于定义方法级别的重试机制。 -
@CircuitBreaker:用于实现断路器模式,防止故障蔓延(适用于Resilience4j等库)。 -
@EnableDiscoveryClient:启用服务发现功能,配合如Eureka、Consul等服务注册与发现工具使用。 -
@StreamListener:用于监听消息流中的事件,在Spring Cloud Stream项目中有广泛应用。 -
@KafkaListener:用于监听Kafka主题的消息。 -
@Scheduled:用于定时任务调度(已提及但值得再次强调其重要性)。 -
@TimeGate:用于控制方法执行的时间窗口(某些第三方库提供)。
2.2.2 针对controller的相关注解
@Controller:用于定义Spring MVC的控制器类。@RestController:组合了@Controller和@ResponseBody,用于构建RESTful Web服务,简化了JSON或XML响应的返回。@RequestMapping:用于映射Web请求到处理方法上,可以指定HTTP请求的方法类型(GET、POST等),URL路径等。此注解可作用于类或方法级别。@GetMapping:是@RequestMapping的快捷方式,专门用于映射GET请求。@PostMapping:是@RequestMapping的快捷方式,专门用于映射POST请求。@PutMapping:是@RequestMapping的快捷方式,专门用于映射PUT请求。@DeleteMapping:是@RequestMapping的快捷方式,专门用于映射DELETE请求。@PathVariable:用于获取URL中的占位符参数,例如在动态路由中使用。@RequestParam:用于绑定查询参数或表单参数到方法参数上。@RequestBody:用于将HTTP请求正文转换为对象,通常与POST或PUT请求一起使用。@ResponseBody:用于指示方法返回值应直接写入HTTP响应体,而不是解析为视图。@ExceptionHandler:用于定义全局异常处理器,当发生特定类型的异常时执行该方法。
2.2.3 AOP相关注解
面向切面编程(AOP,Aspect-Oriented Programming)是Spring框架中的一个重要特性,它允许你定义方法拦截器和切入点,从而将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来。以下是常用的AOP相关注解:
-
@Aspect:定义一个切面类,该类可以包含多个通知(Advice)。 -
@Pointcut:定义一个切入点表达式,用于指定哪些方法需要被拦截。切入点表达式可以复用。 -
@Before:在目标方法执行之前执行的通知。可以访问方法参数,但不能阻止方法执行(除非抛出异常)。 -
@After:在目标方法执行之后执行的通知,无论方法是否抛出异常。无法访问方法返回值或异常信息。 -
@AfterReturning:在目标方法成功执行之后执行的通知,可以访问方法的返回值。 -
@AfterThrowing:在目标方法抛出异常后执行的通知,可以捕获特定类型的异常并进行处理。 -
@Around:环绕通知,是最强大的通知类型。可以在方法执行前后执行自定义逻辑,并且可以选择是否继续执行目标方法。还可以访问方法参数、返回值和异常信息。 -
@DeclareParents:引介通知(Introduction Advice),用于为现有类添加新方法或属性。通常与@Aspect一起使用。 -
@ControllerAdvice:这是一个 Spring MVC 提供的注解,用于定义全局异常处理、数据绑定结果处理等。它可以应用于一个类上,使得该类中的方法可以处理所有控制器 (@Controller) 中抛出的异常或进行数据预处理。 -
@RestControllerAdvice@RestControllerAdvice是 Spring 框架中的一个注解,它是 @ControllerAdvice 和 @ResponseBody 的组合注解。它主要用于全局处理控制器中抛出的异常,并且返回的内容会自动转换为 HTTP 响应体。- 主要用途:
全局异常处理:可以捕获所有控制器中抛出的异常,并进行统一处理。
响应格式化:返回的内容会被自动转换为 JSON 或 XML 格式(取决于配置),方便前后端交互。
数据绑定和校验错误处理:可以处理表单验证失败等场景。 - 与
@ControllerAdvice的区别:
@ControllerAdvice只提供全局异常处理功能,但返回的内容不会自动转换为 HTTP 响应体。
@RestControllerAdvice则是将 @ControllerAdvice 和 @ResponseBody 的功能结合在一起,简化了代码编写
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = {Exception.class})public ResponseEntity<Object> handleAnyException(Exception ex) {// 处理异常逻辑return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}@ExceptionHandler(value = {MyCustomException.class})public ResponseEntity<Object> handleCustomException(MyCustomException ex) {// 处理自定义异常逻辑return new ResponseEntity<>(ex.getErrorResponse(), ex.getStatus());}
}
2.2.4 @Enable系列注解
@Enable并不是Java标准库自带的一个具体注解,而是一个命名约定。在Spring框架及其生态系统中,存在许多以@Enable开头的注解,它们用于开启特定的功能或特性。这些注解通常会触发相应的自动配置类的加载,从而简化开发者的配置工作。
@EnableTransactionManagement:启用Spring的事务管理功能。@EnableScheduling:启用基于注解的定时任务调度支持。@EnableCaching:启用缓存管理功能。@EnableAsync:启用异步方法执行的支持。@EnableJpaRepositories:配置JPA仓库接口的基础包位置,用于扫描和注册仓库实现。@EnableWebMvc:自定义Spring MVC的配置,替代默认配置。@EnableFeignClients:启用Feign客户端声明式服务调用的支持(来自Spring Cloud Netflix)。@EnableDiscoveryClient:使应用程序能够注册到服务发现服务器,并从其获取其他微服务的位置信息(同样来自Spring Cloud Netflix)。
2.3 常用Lombok注解
Lombok 是一个可以通过注解简化 Java 代码的库,减少样板代码的编写。以下是 Lombok 中常用的注解:
-
@Getter / @Setter:自动生成类属性的 getter 和 setter 方法。 -
@ToString:自动生成toString方法,默认包含所有非静态字段。 -
@EqualsAndHashCode:自动生成equals和hashCode方法,默认基于所有非静态字段。 -
@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor:自动生成无参构造函数、全参构造函数和基于 final 或带有@NonNull注解的字段的构造函数。 -
@Data:综合了@ToString,@EqualsAndHashCode,@Getter,@Setter和@RequiredArgsConstructor的功能,适用于简单的 POJO 类。 -
@Builder:提供构建器模式的支持,允许通过链式调用来创建对象实例。 -
@Slf4j / @Log4j / @Log4j2 / @CommonsLog / @Log:自动生成日志记录器字段,支持不同的日志框架。 -
@Cleanup:自动管理资源关闭,类似于 try-with-resources 语句。 -
@SneakyThrows:允许方法抛出受检异常而不需要显式声明或处理。 -
@Delegate:实现委托模式,将方法调用委托给指定的对象。
相关文章:
[Java基础] 常用注解
文章目录 1. 元注解2. 非元注解2.1 常用JDK自带注解2.2 常用Spring相关注解2.2.1 在Spring框架中,注解用于简化配置和增强代码的可读性。以下是常用的Spring注解的一部分2.2.2 针对controller的相关注解2.2.3 AOP相关注解2.2.4 Enable系列注解 2.3 常用Lombok注解 1…...
uvm中的run_test作用
在SystemVerilog和UVM验证环境中,run_test() 是启动UVM仿真流程的核心函数。它负责初始化UVM框架、创建测试用例实例,并触发UVM的Phase机制来执行验证环境的构建和运行 1. run_test() 的作用 run_test() 是UVM提供的内置函数,定义在UVM库中…...
brew search报错,xcrun:error:invalid active developer path CommandLineTools
问题出现的原因 出现“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”错误,通常是因为Xcode命令行工具未正确安装或其路径已损坏。以下是几种常见的…...
C#内置委托(Action)(Func)
概述 在 C# 中,委托是一种类型,它表示对具有特定参数列表和返回类型的方法的引用。C# 提供了一些内置委托,使得开发者可以更方便地使用委托功能,无需手动定义委托类型。本文将详细介绍 Action 和 Func 这两个常用的内置委托。 A…...
kubernetes 部署项目
随着容器化技术的发展,使用Kubernetes(简称K8s)来部署和管理应用已经成为现代软件开发的标准实践之一。Kubernetes提供了一套强大的工具集,使得部署、扩展和管理应用程序变得更为简便高效。本文将带你走过从准备环境到部署一个实际…...
《几何原本》命题I.2
《几何原本》命题I.2 从一个给定的点可以引一条线段等于已知的线段。 设 A A A 为给定点, B C BC BC 为给定线段 连接 A B AB AB,作等边 △ A B D \triangle ABD △ABD 以 B B B 为圆心, B C BC BC 为半径作小圆 延长 D B DB DB 交小圆…...
【我的 PWN 学习手札】House of Kiwi
House of Kiwi 之前我们利用IO_FILE一般是通过劫持vtable来实现的, House of Kiwi虽然不是通过劫持vtable来实现,但实质上是劫持vtable指向的全局的_IO_file_jumps_表来实现的。注意:对于某些版本的glibc,_IO_file_jumps_并不可写…...
nvm的学习
学习 nvm(Node Version Manager) 是掌握 Node.js 开发的关键技能之一。以下是系统的学习路径和实战指南,涵盖从基础到进阶的内容: 一、基础入门 1. nvm 的核心作用 多版本共存:安装和管理多个 Node.js 版本ÿ…...
haclon固定相机位标定
什么是标定? 工业应用中相机拍到一个mark点的坐标为C1(Cx,Cy),C1点对应的龙门架/机械手等执行端对应的坐标是多少? 标定就是解决这个问题,如相机拍到一个点坐标C1(Cx,Cy),…...
stm32(hal库)学习笔记-时钟系统
在stm32中,时钟系统是非常重要的一环,他控制着整个系统的频率。因此,我们有理由好好学一下时钟系统。 什么是时钟? 时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单…...
【Java项目】基于SpringBoot的财务管理系统
【Java项目】基于SpringBoot的财务管理系统 技术简介:采用Java技术、SpringBoot框架、MySQL数据库等实现。系统基于B/S架构,前端通过浏览器与后端数据库进行信息交互,后端使用SpringBoot框架和MySQL数据库进行数据处理和存储,实现…...
Qt中如果槽函数运行时间久,避免阻塞主线程的做法
Qt中如果槽函数运行时间久,避免阻塞主线程的做法 一、解决步骤 创建一个工作线程类:继承自QObject,并在其中实现槽函数的逻辑。将工作线程类的实例移动到单独的线程中:通过moveToThread()方法将对象移动到新线程。启动线程&…...
曹操智行构建国内首个全域自研闭环智驾生态
2月28日,曹操出行举办曹操智行自动驾驶平台上线仪式,宣布已成功构建国内首个“F立方”全域自研闭环智驾生态,同时在苏杭两地开启Robotaxi运营试点,并投放搭载吉利最新智驾系统的车辆。 此次试点运营,标志着曹操出行在…...
day02_Java基础
文章目录 day02_Java基础一、今日课程内容二、数组(熟悉)1、定义格式2、基本使用3、了解数组的内存图介绍4、数组的两个小问题5、数组的常见操作 三、方法(熟悉)1、定义格式2、方法重载overload 四、面向对象(掌握&…...
SpringSecurity 实现token 认证
配置类 Configuration EnableWebSecurity EnableGlobalMethodSecurity(prePostEnabledtrue) public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { Bean Override public AuthenticationManager authenticationManagerBean() throws Exception {return s…...
轻松实现语音生成:GPT-SoVITS V2整合包的远程访问操作详解
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS!这款由花儿不哭大佬精心打造的语音克隆神…...
解锁状态模式:Java 编程中的行为魔法
系列文章目录 后续补充~~~ 文章目录 一、状态模式:概念与原理二、状态模式的深度剖析(一)模式定义与核心思想(二)模式结构与角色 三、状态模式的实际应用场景(一)电商系统中的订单状态管理&…...
算法与数据结构(相交链表)
题目 思路 1.哈希集合 因为要求是否存在相交节点,那么我们就可以利用哈希集合先将listA链表里面的所有数据存入,然后访问listB,判断其是否有节点在哈希集合中,若存在,则说明此节点为相交的节点。若遍历完之后仍没有发…...
浅入浅出Selenium DevTools
前言 在自动化测试领域,Selenium一直是主流工具之一。随着前端技术的不断发展,浏览器的功能也在不断丰富。 Selenium 3版本前,一套通用的采集流程如上图所示: 打开Charles,设置Session自动导出频次及导出路径Seleniu…...
软件工程---净室软件工程
净室软件工程是一种软件开发方法,旨在通过形式化的数据和严格的测试来提高软件的可靠性和减少缺陷的数量。它的核心思想是在软件开发过程中最小化或消除软件缺陷,从而提高软件的质量和可靠性。这种方法强调在软件生命周期的早期阶段使用形式化方法进行规…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
