一、注解的定义
Java注解是Java编程语言中的一种特殊形式的元数据,它们可以用于为程序的各个元素(例如类、方法、字段等)添加额外的信息和属性。注解是在Java 5中引入的,通过在代码中使用注解,开发人员可以提供关于程序结构和行为的补充信息,这些信息可以被编译器、工具和运行时环境所利用。
注解本身是以@符号开头,紧跟着注解的名称,并可以包含一些可选的参数。注解可以应用于类、接口、枚举、方法、字段和其他程序元素上。
Java注解的定义方式如下:
public @interface MyAnnotation {
// 注解元素声明
String value(); // 声明一个名为"value"的注解元素
int count() default 0; // 声明一个名为"count"的注解元素,并设置默认值为0
String[] tags(); // 声明一个名为"tags"的注解元素,类型为String数组
}
二、常用注解汇总
@Autowired:用于实现依赖注入,将匹配的依赖对象自动注入到目标对象中。
@RequestMapping:用于将请求映射到处理器方法上,定义URL路径与处理器方法的映射关系。
@PostMapping、@GetMapping、@PutMapping、@DeleteMapping:这些注解是@RequestMapping的特定方法级别的变体,用于指定特定HTTP请求方法的映射关系。
@PathVariable:用于从URL路径中获取请求参数,并将其绑定到处理器方法的参数上。
@RequestBody:用于将请求体中的内容绑定到处理器方法的参数上,常用于接收和处理JSON或XML格式的请求数据。
@ResponseBody:用于将处理器方法的返回值直接作为响应的内容返回,常用于返回JSON或XML格式的响应数据。
@Transactional:用于标记事务的边界,确保在方法执行期间启用事务管理。
@Component、@Service、@Repository:这些注解用于标记类为组件、服务或仓库,配合Spring的组件扫描机制,使其能够被自动发现并创建实例。
@Aspect:用于定义切面,配合AOP(面向切面编程)实现横切关注点的模块化。
@Configuration:用于标记类为配置类,定义Bean的创建和依赖关系的配置。
@Override:用于标记方法覆盖父类的方法,提醒编译器进行检查。
@Deprecated:用于标记已过时的方法、类或字段,提醒开发人员不建议使用该元素。
@SuppressWarnings:用于抑制编译器警告信息,可以在特定的代码块或元素上禁用指定类型的警告。
@FunctionalInterface:用于标记函数式接口,确保接口只有一个抽象方法。
@SafeVarargs:用于抑制使用可变参数方法或构造函数时的警告。
@Nullable、@Nonnull:用于标记参数、字段或返回值的可空性,用于静态代码分析或文档生成。
@Documented:用于指定注解是否包含在Java文档中。
@Inherited:用于指示注解是否可以被子类继承。
@Retention:用于指定注解的保留策略,包括RetentionPolicy.SOURCE、RetentionPolicy.CLASS和RetentionPolicy.RUNTIME。
@Target:用于指定注解的目标元素类型,包括ElementType.TYPE、ElementType.METHOD、ElementType.FIELD等。
@Repeatable:用于指定注解是否可重复应用于同一目标元素。
@Resource:用于实现依赖注入,类似于@Autowired,但更通用且不依赖于具体框架。
@PostConstruct:用于指定在构造函数执行之后,依赖注入完成之后执行的方法。
@PreDestroy:用于指定在对象销毁之前执行的方法。
0.运行时注解之@SpringBootApplication
@SpringBootApplication是Spring Boot框架中的注解,用于标识一个主类(Main Class)是Spring Boot应用程序的入口点。该注解结合了多个常用注解,简化了Spring Boot应用程序的配置。
三、Java自定义注解(@interface)
基本注解和元注解都是 Java 内置注解,如果这两种注解不能满足您的需求,Java 还允许您自定义注解。
Java 使用 @interface 关键字(interface 关键字前加 @ 符号)实现自定义注解。定义注解与定义接口非常像,如下代码可定义一个简单形式的注解类型。
// 定义一个简单的注解类型
public @interface Test {//TODO:
}
上述代码声明了一个 Test 注解。默认情况下,注解可以在程序的任何地方使用,通常用于修饰类、接口、方法和变量等。
定义注解和定义类相似,注解前面的访问修饰符和类一样有两种,分别是公有访问权限(public)和默认访问权限(默认不写)。一个源程序文件中可以声明多个注解,但只能有一个是公有访问权限的注解。且源程序文件命名和公有访问权限的注解名一致。
不包含任何成员变量的注解称为标记注解,例如上面声明的 Test 注解以及基本注解中的 @Override 注解都属于标记注解。根据需要,注解中可以定义成员变量,成员变量以无形参的方法形式来声明,其方法名和返回值定义了该成员变量的名字和类型。代码如下所示:
public @interface MyTag {// 定义带两个成员变量的注解// 注解中的成员变量以方法的形式来定义String name();int age();
}
以上代码中声明了一个 MyTag 注解,定义了两个成员变量,分别是 name 和 age。成员变量也可以有访问权限修饰符,但是只能有公有权限和默认权限。
如果在注解里定义了成员变量,那么使用该注解时就应该为它的成员变量指定值,如下代码所示。
public class Test {// 使用带成员变量的注解时,需要为成员变量赋值@MyTag(name="xx", age=6)public void info() {...}...
}