Spring原理学习系列之一:注解原理解析

简介: 对于Spring注解大家肯定都不陌生,在日常开发工作中也会经常使用到注解。有时候提问小伙伴,注解的原理是什么,大部分都回答是利用了反射机制。但是继续深入提问,在Spring中是如何解析这些自带注解以及注解到底在什么时候起作用等问题时,很多人都会犯嘀咕。同样我在实际使用的过程中,也会有相同的困惑。所以一直想探究下注解实际的工作原理以及设计思想。用此文记录下自己对于注解原理的理解,也为有同样疑问的小伙伴提供些不同的理解角度。原理解析使用实例

引言

对于Spring注解大家肯定都不陌生,在日常开发工作中也会经常使用到注解。有时候提问小伙伴,注解的原理是什么,大部分都回答是利用了反射机制。但是继续深入提问,在Spring中是如何解析这些自带注解以及注解到底在什么时候起作用等问题时,很多人都会犯嘀咕。同样我在实际使用的过程中,也会有相同的困惑。所以一直想探究下注解实际的工作原理以及设计思想。用此文记录下自己对于注解原理的理解,也为有同样疑问的小伙伴提供些不同的理解角度。

  • 原理解析
  • 使用实例


一、 原理解析

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。—百度百科


注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后的某个时刻非常方便的使用这些数据。—Java编程思想



以上为注解概念的通用解释,我想大多数和我一样看完这样的解释还是一头雾水,不知所云。 自JDK1.5就开始引入注解的概念。按照自己的理解,注解其实就是一种标识,而这个标识中包含很多属性,这些属性就像是键值对,注解解析类可以通过反射获取到(指的是运行时加载类型的注解)键值对当中的值,根据获取到的解析值再去处理后续的程序逻辑。简单的说,注解就是一种类似签名的含义,这种签名类在运行时获取,简化了代码开发,同时也减少了理解成本。以下是@ResponseBody的注解源码。

@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME)  
@Documented 
public @interface ResponseBody {
}

其中@Target :指明注解使用的目标。

(1)TYPE:指的是在类,接口(包括注解)或者enum上使用的注解。

(2)FIELD:指的在field属性,也包括enum常量使用的注解。

(3)METHOD:指的是在方法声明上使用的注解。

(4)PARAMETER:指的是在参数上使用的注解,

(5)CONSTRUCTOR: 指的是在构造器使用的注解。

(6)LOCAL_VARIABLE:指的是在局部变量上使用的注解。

(7)ANNOTATION_TYPE:指的是在注解上使用的元注解

(8)PACKAGE:指的是在包上使用的注解。

@Retention :指明注解的生命周期,或者说在什么阶段注解起作用。

(1)SOURCE: 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。Annotations are to be discarded by the compiler.

(2)CLASS: 注解被保留到class文件,jvm加载class文件时候被遗弃。这是默认的生命周期。

Annotations are to be recorded in the class file by the compiler but need not be retained by the VM at run time. This is the default behavior.

(3)RUNTIME: 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在,保存到class对象中,可以通过反射来获取。

@Documented :用于生成文档

查看@ResonseBody注解的class文件

image.png

从上图可知注解@ResponseBody继承了Annotation,而Annotation本质上是一个接口。如下面源码所示。

package java.lang.annotation;
/**
 * The common interface extended by all annotation types.  Note that an
 * interface that manually extends this one does <i>not</i> define
 * an annotation type.  Also note that this interface does not itself
 * define an annotation type.
 *
 * More information about annotation types can be found in section 9.6 of
 * <cite>The Java&trade; Language Specification</cite>.
 *
 * The {@link java.lang.reflect.AnnotatedElement} interface discusses
 * compatibility concerns when evolving an annotation type from being
 * non-repeatable to being repeatable.
 *
 * @author  Josh Bloch
 * @since   1.5
 */
public interface Annotation {
...
}

二、使用实例

以下代码为一个自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Handler {
    String name() default "";
}

我们通常使用的注解是运行时加载的,所以可以通过反射机制获取到相关的数据,这种类型的注解是我们需要的。所以注解需要配合注解解析类一起使用,根据解析注解的属性来完成之后的代码逻辑。

public class AnnotationUtils {
    /**
     * 
     * 方法功能描述:获取注解
     * @author taomeng 2018年6月29日 下午4:19:05 
     * @param clazz
     * @return
     */
    public static String getName(final Class<?> clazz){
        String name = clazz.getAnnotation(Handler.class).name();
        return name;
    }
}
相关文章
|
7月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
8月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1259 128
|
7月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
707 2
|
8月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
525 12
|
8月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
431 0
探索Spring Boot的@Conditional注解的上下文配置
|
8月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
327 0
Spring中最大化@Lazy注解,实现资源高效利用
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
259 0
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
992 26
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
686 73
|
XML Java 数据格式
spring ioc中的一些常用annotation注解配置
spring ioc中的一些常用annotation注解配置

热门文章

最新文章

推荐镜像

更多
  • DNS