SpringBoot 的注解原理,及自定义注解

JAVA 注解原理

在 Java 项目编译后,注解会以特定的方式存储在 .class 文件中,并可以在运行时通过反射机制进行解析和处理。以下是关于注解在编译后如何存在、以及在运行时如何解析和处理的详细解释:

1. 注解的存储方式

Java 的注解可以有不同的保留策略(Retention Policy),这决定了注解在编译后的 .class 文件中的存储方式以及它们在运行时的可见性。常见的保留策略有三种:

SOURCE:注解只在源码中存在,编译后不会被保留到 .class 文件中。例如,@Override 就是这样的注解。

CLASS:注解会被保留到 .class 文件中,但在运行时不可见(即通过反射无法访问到)。这是注解的默认保留策略。

RUNTIME:注解不仅会被保留到 .class 文件中,而且在运行时可以通过反射机制进行访问。Spring 框架中的大多数注解(如 @Autowired, @RequestMapping 等)都是 RUNTIME 注解。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
}

2. 运行时如何解析注解

在运行时,Java 通过反射机制来解析和处理注解。反射允许程序动态地检查和操作类的结构,包括类、方法、字段、参数等的注解信息。

获取注解信息的步骤:

1. 获取类的引用

• 通过 Class<?> clazz = MyClass.class; 或者 Class<?> clazz = object.getClass(); 获取目标类的引用。

2. 获取注解:   (下面获取注解的方式,就教反射)

为什么要用反射创建对象_为什么几乎所有的Java框架都要用到反射机制,她的魅力在哪里?...-CSDN博客

• 可以使用以下方法来获取注解:

• clazz.getAnnotation(MyAnnotation.class):获取类级别的注解。

• method.getAnnotation(MyAnnotation.class):获取方法级别的注解。

• field.getAnnotation(MyAnnotation.class):获取字段级别的注解。

• parameter.getAnnotation(MyAnnotation.class):获取参数级别的注解。

这些方法返回的是注解对象,如果注解不存在,则返回 null。

3. 读取注解属性

• 通过调用注解对象的方法来读取注解的属性值。例如:

MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
if (annotation != null) {
    String value = annotation.value();
    System.out.println("Annotation value: " + value);
}

----- 

自定义注解:

通过 @Retention 定义 注解在java文件中如何保存 。 

SOURCE , CLASS , RUNTIME

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {

    // 注解定义

}

自定义注解原理是通过自己定义注解,将注解应用到需要注解的方法上,然后在拦截器中拦截到注解,进行后续的处理。在Spring Boot中,我们可以使用注解和AOP来实现自定义注解的功能。通过在需要注解的方法上添加注解,并在拦截器中拦截到该注解,可以对方法进行相应的逻辑处理。例如,在需要注解的方法上加上注解@Log("测试自定义注解"),可以实现记录系统日志并入库的功能。通过自定义注解,我们能够清楚地知道如何使用Spring AOP实现自定义注解并进行相应的逻辑处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [分分钟玩转SpringBoot自定义注解](https://blog.csdn.net/bieber007/article/details/109695109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [spring aop 自定义注解保存操作日志到mysql数据库 源码](https://download.csdn.net/download/y_h_d/48993109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值