Java注解

文章目录

java注解概述

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。

  1. 特点

采用纯java代码,不再需要配置繁杂的xml文件

在配置中也可享受面向对象带来的好处

类型安全对重构可以提供良好的支持

减少复杂配置文件的同时亦能享受到springIoC容器提供的功能

注解原理是什么

注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。

我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注

解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues

这个Map中索引出对应的值。而memberValues的来源是Java常量池。

Java 注解的理解

注解是通过@interface 关键字来进行定义的,形式和接口差不多,只是前面多了一个

java 复制代码
@
public @interface TestAnnotation {
}

使用时@TestAnnotation 来引用,要使注解能正常工作,还需要使用元注解,它是可以注解

到注解上的注解。元标签有@Retention @Documented @Target @Inherited @Repeatable 五种

@Retention 说明注解的存活时间,取值有 RetentionPolicy.SOURCE 注解只在源码阶段保留,

在编译器进行编译时被丢弃;RetentionPolicy.CLASS 注解只保留到编译进行的时候,并不会

被加载到 JVM 中。RetentionPolicy.RUNTIME 可以留到程序运行的时候,它会被加载进入到 JVM

中,所以在程序运行时可以获取到它们。

@Documented 注解中的元素包含到 javadoc 中去

@Target 限 定 注 解 的 应 用 场 景 , ElementType.FIELD 给 属 性 进 行 注 解 ;

ElementType.LOCAL_VARIABLE 可以给局部变量进行注解;ElementType.METHOD 可以给方法

进行注解;ElementType.PACKAGE 可以给一个包进行注解 ElementType.TYPE 可以给一个类型

进行注解,如类、接口、枚举

@Inherited 若一个超类被@Inherited 注解过的注解进行注解,它的子类没有被任何注解应用的话,该子类就可继承超类的注解;

注解的作用:

1)提供信息给编译器:编译器可利用注解来探测错误和警告信息

2)编译阶段:软件工具可以利用注解信息来生成代码、html 文档或做其它相应处理;

3)运行阶段:程序运行时可利用注解提取代码

注解是通过反射获取的,可以通过 Class 对象的 isAnnotationPresent()方法判断它是否应用了

某个注解,再通过 getAnnotation()方法获取 Annotation 对象

java注解的分类

注解根据来源可分为: 系统注解(自带的,取决于JDK版本)、自定义注解及第三方注解

系统注解根据用途又可分为: java内置注解和元注解

根据运行机制(保留到什么时候)可分为: 源码注解、编译注解和运行注解

系统注解

**定义:**包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。

@Override

1.表示当前方法覆盖了父类的方法

2.此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息

@Deprecated

1.表示方法已经过时,方法上有横线,使用时会有警告。

2.此注释可用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告

java 复制代码
@Deprecated 
@Deprecated
class TestClass {
  // do 
}

@SuppressWarnings

1.用于关闭对类、方法、成员编译时产生的特定警告。

2.用来抑制编译时的警告信息。与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,

1.抑制单类型的警告

java 复制代码
@SuppressWarnings("unchecked")  
public void addItems(String item){  
  @SuppressWarnings("rawtypes")  
   List items = new ArrayList();  
   items.add(item);  
}

2.抑制多类型的警告

java 复制代码
@SuppressWarnings(value={"unchecked", "rawtypes"})  
public void addItems(String item){  
   List items = new ArrayList();  
   items.add(item);  
}

3.抑制所有类型的警告

java 复制代码
@SuppressWarnings("all")  
public void addItems(String item){  
   List items = new ArrayList();  
   items.add(item);  
}

@SafeVarargs

在声明具有模糊类型(比如:泛型)的可变参数的构造函数或方法时,Java编译器会报unchecked警告。

java 复制代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
public @interface SafeVarargs {
    
}

@FunctionalInterface

用于指示被修饰的接口是函数式接口,在 JDK8 引入。

@FunctionalInterfacepublic interface UserService {

java 复制代码
    void getUser(Long userId);
 
 
    // 默认方法,可以用多个默认方法
    public default void setUser() {
    }
 
 
    // 静态方法
    public static void saveUser() {
    }
    
    // 覆盖Object中的equals方法
    public boolean equals(Object obj);
}

元注解

**定义:**元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@Documented(标明是否生成javadoc文档)

@Retention

Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。

取值范围:

RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。

RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。

RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

java 复制代码
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
}

@Documented

它的作用是能够将注解中的元素包含到 Javadoc 中去。

@Target

当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。

主要场景:

ElementType.ANNOTATION_TYPE 可以给一个注解进行注解

ElementType.CONSTRUCTOR 可以给构造方法进行注解

ElementType.FIELD 可以给属性进行注解

ElementType.LOCAL_VARIABLE 可以给局部变量进行注解

ElementType.METHOD 可以给方法进行注解

ElementType.PACKAGE 可以给一个包进行注解

ElementType.PARAMETER 可以给一个方法内的参数进行注解

ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

java 复制代码
package javax.validation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Valid {
}

@Inherited

Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

@Repeatable

Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。

自定义注解

**定义:**用户可以根据自己的需求定义注解。

https://blog.csdn.net/weixin_45020244/article/details/124087535

注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

修饰符: 访问修饰符必须为public,不写默认为pubic;

关键字: 关键字为@interface;

注解名称: 注解名称为自定义注解的名称,使用时还会用到;

注解内容: 注解中内容,对注解的描述。

如何自定义注解实现功能

创建自定义注解和创建一个接口相似,但是注解的 interface 关键字需要以@符号开头。

注解方法不能带有参数;

注解方法返回值类型限定为:基本类型、String、Enums、Annotation 或者是这些类型的

数组;

注解方法可以有默认值;

注解本身能够包含元注解,元注解被用来注解其它注解。

java 复制代码
@Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD ,ElementType.TYPE})  //可以在字段、枚举的常量、方法
@Retention(RetentionPolicy.RUNTIME)
public @interface Init {
     String value() default "";
}

Java常用注解

Spring Web MVC 注解

@RequestMapping

@RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射。Spring MVC和Spring WebFlux都通过RquestMappingHandlerMapping和RequestMappingHndlerAdapter两个类来提供对@RequestMapping注解的支持。

@RequestMapping注解对请求处理类中的请求处理方法进行标注;@RequestMapping注解拥有以下的六个配置属性:

value:映射的请求URL或者其别名

method:兼容HTTP的方法名

params:根据HTTP参数的存在、缺省或值对请求进行过滤

header:根据HTTP Header的存在、缺省或值对请求进行过滤

consume:设定在HTTP请求正文中允许使用的媒体类型

product:在HTTP响应体中允许使用的媒体类型

提示:在使用@RequestMapping之前,请求处理类还需要使用@Controller或@RestController进行标记

@RequestBody

@RequestBody在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中,请求主体参数是通过HttpMessageConverter传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。此外,还可以通过@Valid注解对请求主体中的参数进行校验。

@GetMapping

@GetMapping注解用于处理HTTP GET请求,并将请求映射到具体的处理方法中。具体来说,@GetMapping是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.GET)的快捷方式。

@PostMapping

@PostMapping注解用于处理HTTP POST请求,并将请求映射到具体的处理方法中。@PostMapping与@GetMapping一样,也是一个组合注解,它相当于是@RequestMapping(method=HttpMethod.POST)的快捷方式。

@PutMapping

@PutMapping注解用于处理HTTP PUT请求,并将请求映射到具体的处理方法中,@PutMapping是一个组合注解,相当于是@RequestMapping(method=HttpMethod.PUT)的快捷方式。

@DeleteMapping

@DeleteMapping注解用于处理HTTP DELETE请求,并将请求映射到删除方法中。@DeleteMapping是一个组合注解,它相当于是@RequestMapping(method=HttpMethod.DELETE)的快捷方式。

@PatchMapping

@PatchMapping注解用于处理HTTP PATCH请求,并将请求映射到对应的处理方法中。@PatchMapping相当于是@RequestMapping(method=HttpMethod.PATCH)的快捷方式。

@ControllerAdvice

@ControllerAdvice是@Component注解的一个延伸注解,Spring会自动扫描并检测被@ControllerAdvice所标注的类。@ControllerAdvice需要和@ExceptionHandler、@InitBinder以及@ModelAttribute注解搭配使用,主要是用来处理控制器所抛出的异常信息。

首先,我们需要定义一个被@ControllerAdvice所标注的类,在该类中,定义一个用于处理具体异常的方法,并使用@ExceptionHandler注解进行标记。

此外,在有必要的时候,可以使用@InitBinder在类中进行全局的配置,还可以使用@ModelAttribute配置与视图相关的参数。使用@ControllerAdvice注解,就可以快速的创建统一的,自定义的异常处理类。

@ResponseBody

@ResponseBody会自动将控制器中方法的返回值写入到HTTP响应中。特别的,@ResponseBody注解只能用在被@Controller注解标记的类中。如果在被@RestController标记的类中,则方法不需要使用@ResponseBody注解进行标注。@RestController相当于是@Controller和@ResponseBody的组合注解。

@ExceptionHandler

@ExceptionHander注解用于标注处理特定类型异常类所抛出异常的方法。当控制器中的方法抛出异常时,Spring会自动捕获异常,并将捕获的异常信息传递给被@ExceptionHandler标注的方法。

@ResponseStatus

@ResponseStatus注解可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。特别地,我们可以使用HttpStauts类对该注解的value属性进行赋值。

@PathVariable

@PathVariable注解是将方法中的参数绑定到请求URI中的模板变量上。可以通过@RequestMapping注解来指定URI的模板变量,然后使用@PathVariable注解将方法中的参数绑定到模板变量上。特别地,@PathVariable注解允许我们使用value或name属性来给参数取一个别名。

注.如果参数是一个非必须的,可选的项,则可以在@PathVariable中设置require = false

@RequestParam

@RequestParam注解用于将方法的参数与Web请求的传递的参数进行绑定。使用@RequestParam可以轻松的访问HTTP请求参数的值。

@Controller

@Controller是@Component注解的一个延伸,Spring会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。

@RestController

@RestController是在Spring 4.0开始引入的,这是一个特定的控制器注解。此注解相当于@Controller和@ResponseBody的快捷方式。当使用此注解时,不需要再在方法上使用@ResponseBody注解。

@ModelAttribute

通过此注解,可以通过模型索引名称来访问已经存在于控制器中的model。

1.与@PathVariable和@RequestParam注解一样,如果参数名与模型具有相同的名字,则不必指定索引名称

2.特别地,如果使用@ModelAttribute对方法进行标注,Spring会将方法的返回值绑定到具体的Model上

3.在Spring调用具体的处理方法之前,被@ModelAttribute注解标注的所有方法都将被执行。

@CrossOrigin

@CrossOrigin注解将为请求处理类或请求处理方法提供跨域调用支持。如果我们将此注解标注类,那么类中的所有方法都将获得支持跨域的能力。使用此注解的好处是可以微调跨域行为。

@InitBinder

@InitBinder注解用于标注初始化WebDataBinider的方法,该方法用于对Http请求传递的表单数据进行处理,如时间格式化、字符串处理等。

Spring Bean 注解

@ComponentScan

@ComponentScan注解用于配置Spring需要扫描的被组件注解注释的类所在的包。可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名。

@Component

@Component注解用于标注一个普通的组件类,它没有明确的业务范围,只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。

@Service

@Service注解是@Component的一个延伸(特例),它用于标注业务逻辑类。与@Component注解一样,被此注解标注的类,会自动被Spring所管理。

@Repository

@Repository注解也是@Component注解的延伸,与@Component注解一样,被此注解标注的类会被Spring自动管理起来,@Repository注解用于标注DAO层的数据持久化类

Spring Boot注解

@SpringBootApplication

@SpringBootApplication注解是一个快捷的配置注解,在被它标注的类中,可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。此注解相当于@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。

@EnableAutoConfiguration

@EnableAutoConfiguration注解用于通知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项。

@ConditionalOnClass与@ConditionalOnMissingClass

这两个注解属于类条件注解,它们根据是否存在某个类作为判断依据来决定是否要执行某些配置。

@ConditionalOnBean与@ConditionalOnMissingBean

这两个注解属于对象条件注解,根据是否存在某个对象作为依据来决定是否要执行某些配置方法。

@ConditionalOnProperty

@ConditionalOnProperty注解会根据Spring配置文件中的配置项是否满足配置要求,从而决定是否要执行被其标注的方法。

@ConditionalOnResource

此注解用于检测当某个配置文件存在使,则触发被其标注的方法

@ConditionalOnWebApplication与@ConditionalOnNotWebApplication

这两个注解用于判断当前的应用程序是否是Web应用程序。如果当前应用是Web应用程序,则使用Spring WebApplicationContext,并定义其会话的生命周期。

@ConditionalExpression

此注解可以让我们控制更细粒度的基于表达式的配置条件限制。当表达式满足某个条件或者表达式为真的时候,将会执行被此注解标注的方法。

@Conditional

@Conditional注解可以控制更为复杂的配置条件。在Spring内置的条件控制注解不满足应用需求的时候,可以使用此注解定义自定义的控制条件,以达到自定义的要求。

Jpa

@Entity @Table(name="")

表明这是一个实体类。一般用于jpa ,这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略;

@MappedSuperClass

用在确定是父类的entity上。父类的属性子类可以继承;

@NoRepositoryBean

一般用作父类的repository,有这个注解,spring不会去实例化该repository;

@Column

如果字段名与列名相同,则可以省略;

@Id

表示该属性为主键;

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator = "repair_seq")

表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq;

@SequenceGenerator(name = "repair_seq", sequenceName = "seq_repair", allocationSize = 1)

name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致;

@Transient

表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.

如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic;

@Basic(fetch=FetchType.LAZY)

标记可以指定实体属性的加载方式;

@JsonIgnore

作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响;

@JoinColumn(name="loginId")

一对一:本表中指向另一个表的外键。

一对多:另一个表指向本表的外键。

@OneToOne

@OneToMany

@ManyToOne

对应Hibernate配置文件中的一对一,一对多,多对一。

全局异常处理

@ControllerAdvice

包含@Component。可以被扫描到。统一处理异常;

@ExceptionHandler(Exception.class)

用在方法上面表示遇到这个异常就执行以下方法。

SpringCloud

@EnableEurekaServer

用在springboot启动类上,表示这是一个eureka服务注册中心;

@EnableDiscoveryClient

用在springboot启动类上,表示这是一个服务,可以被注册中心找到;

@LoadBalanced

开启负载均衡能力;

@EnableCircuitBreaker

用在启动类上,开启断路器功能;

@HystrixCommand(fallbackMethod="backMethod")

用在方法上,fallbackMethod指定断路回调方法;

@EnableConfigServer

用在启动类上,表示这是一个配置中心,开启Config Server;

@EnableZuulProxy

开启zuul路由,用在启动类上;

@SpringCloudApplication

包含

@SpringBootApplication

@EnableDiscovertyClient

@EnableCircuitBreaker

容器配置注解

@Autowired

@Autowired注解用于标记Spring将要解析和注入的依赖项。此注解可以作用在构造函数、字段和setter方法上。

1.作用于构造函数

2.作用于setter方法

3.作用于字段

@Primary

当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。下面将给出一个实例代码来说明这一特性:

@PostConstruct与@PreDestroy

值得注意的是,这两个注解不属于Spring,它们是源于JSR-250中的两个注解,位于common-annotations.jar中。@PostConstruct注解用于标注在Bean被Spring初始化之前需要执行的方法。@PreDestroy注解用于标注Bean被销毁前需要执行的方法。

@Qualifier

当系统中存在同一类型的多个Bean时,@Autowired在进行依赖注入的时候就不知道该选择哪一个实现类进行注入。此时,我们可以使用@Qualifier注解来微调,帮助@Autowired选择正确的依赖项。

Spring DI注解

@DependsOn

@DependsOn注解可以配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象。

@Bean

@Bean注解主要的作用是告知Spring,被此注解所标注的类将需要纳入到Bean管理工厂中。

@Scope

@Scope注解可以用来定义@Component标注的类的作用范围以及@Bean所标记的类的作用范围。@Scope所限定的作用范围有:singleton、prototype、request、session、globalSession或者其他的自定义范围。

用于切面编程(AOP)

@Aspect,@Before,@After,@Around,@Pointcut

配置注解

@ConfigurationProperties

用来加载额外的配置(如 .properties 文件),可用在 @Configuration 注解类,或者 @Bean 注解方法上面。

关于这个注解的用法可以参考《Spring Boot读取配置的几种方式》这篇文章

@EnableConfigurationProperties

一般要配合 @ConfigurationProperties 注解使用,用来开启对 @ConfigurationProperties 注解配置 Bean 的支持

@Value:注入Spring boot application.properties配置的属性的值。示例代码:

mybatis注解

@Select

相关推荐
invicinble10 小时前
jar包在执行的时候需要关注的细节(提供一个解构jvm问题的视角)
java·jvm·jar
麦芽糖021910 小时前
SSE介绍及使用(Server-Send Events)
java
alan072110 小时前
【Java + Elasticsearch全量 & 增量同步实战】
java·elasticsearch·jenkins
hashiqimiya10 小时前
后端springboot的接收前端发来的数据反序列化原理
java
cat三三11 小时前
java之异常
java·开发语言
浙江第二深情11 小时前
前端性能优化终极指南
java·maven
养乐多072211 小时前
【Java】IO流
java
俊男无期11 小时前
超效率工作法
java·前端·数据库
中国胖子风清扬11 小时前
SpringAI和 Langchain4j等 AI 框架之间的差异和开发经验
java·数据库·人工智能·spring boot·spring cloud·ai·langchain
月明长歌12 小时前
【码道初阶】牛客TSINGK110:二叉树遍历(较难)如何根据“扩展先序遍历”构建二叉树?
java·数据结构·算法