[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…...
软件工程---净室软件工程
净室软件工程是一种软件开发方法,旨在通过形式化的数据和严格的测试来提高软件的可靠性和减少缺陷的数量。它的核心思想是在软件开发过程中最小化或消除软件缺陷,从而提高软件的质量和可靠性。这种方法强调在软件生命周期的早期阶段使用形式化方法进行规…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...