[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
:实现委托模式,将方法调用委托给指定的对象。