当前位置: 首页 > news >正文

05.注解的原理

1.注解的本质是创建特殊接口,注解通过 @interface 关键字定义,还得搭配「两个」元注解(用于指定规则)。

@Retention(RetentionPolicy.xxx)
@Target(ElementType.xxx)
public @interface Mycomponent { // 注解的“属性”不是方法,向接口中加入方法即可实现String value() default "默认描述"; // 使用时需要传入值(需默认值)
}

2.注解就是你贴在类、方法、属性上的便利贴,只写信息、不执行逻辑,本身啥也干不了,注解怎么生效?

  • ① 用 @interface 定义"便利贴规则"
  • ② 能贴在哪里(比如只能贴在方法上)
  • ③ 贴了能留多久(比如运行时还能看见)
  • ④ 便利贴上写啥信息(注解属性)

3.贴了标签,还需要有对应处理所有贴了标签的方法或类或属性的处理器。
例如 Spring 启动时会通过 AnnotationConfigApplicationContext 扫描指定包,自动加载内置注解处理器(ConfigurationClassPostProcessor 负责解析 @component、@configuration 注解,将所有贴有这些标签的类装变为 BeanDefinition(未实例化)),Spring 扫描器(如 ClassPathBeanDefinitionScanner)会:

  • ① 遍历指定包路径下的所有 .class 字节码文件(不加载类到 JVM,仅读取字节码)
  • ② 过滤掉非候选类(如接口、抽象类、匿名类 或被 @Conditional 排除的类),解析字节码,判断是否有 @Component,扫描器通过 ASM 框架读取类字节码中的注解元数据。不反射创建类实例,直接解析字节码的 “运行时常量池”,检测类的注解列表是否存在 @Component 或其他派生注解(@Service,……),若存在,则将该类注册为 Spring 容器的 BeanDefinition,后续统一初始化。
  • ③ 找 @Component 时,仅读取字节码文件内容,不会执行类的加载,核心原因是用了 ASM 框架,它直接操作 .class 文件的字节流,解析其中的注解元数据。只有当 Spring 确认该类是候选 Bean 时(有 @Component 且符合条件),(全扫描后)后续才会创建 Bean 对象(即BeanDefinition),才加载到 JVM。即 Spring 扫描器遍历完「指定包路径下所有层级的 .class 字节码文件」之后,才会完成最终的 BeanDefinition 收集和生成。

4.当进行属性注入时(即解析@Autowired),会调用Autowired处理器。
处理器中遍历 Bean 的所有字段(A进入属性注入时,A@raw处于二级缓存或者三级缓存)

Field[] fields = bean.getClass().getDeclaredFields()
for (Field field : fields) {if (field.isAnnotationPresent(Autowired.class)) {field.setAccessible(true)Object depency = context.getBean(field.getType())field.set(bean, depency)}
}

在postProcessProperties方法内会通过反射条件判断是否有目标注解(比如@Autowired),
有则执行注入逻辑,无则直接返回。注解必须满足@Retention(Retention.RUNTIME)。
@Autowired默认是该配置,否则编译后注解信息会被丢弃,反射无法读取。

5.注解元数据存储原理,当给字段加@Autowired时

    1. @Autowired本身带@Retention(Retention.RUNTIME),告诉编译器 “保留注解到运行时”
    1. 编译.java文件为.class文件时,编译器会把@Autowired的信息(目标注解类、属性值等)写入.class文件的运行时常量池→元数据区(专门存类的额外信息,如注解、泛型)。
    1. 最终.class文件里会保留 “该字段被标注了@Autowired” 的记录,不会被丢弃。

6.JVM 加载 Class 并保留元数据:

    1. Spring 启动时,JVM 加载业务类(如UserService.class),会把.class文件中的元数据(包括注解信息)加载到内存中,存入Class对象中。
    1. 此时UserService.class对象里,不仅包含类结构(字段、方法),还包含字段上的注解元数据(比如userDao字段关联了@Autowired)。
http://www.gsyq.cn/news/68566.html

相关文章:

  • 2025最新养殖热泵品牌推荐!畜牧养殖恒温设备权威榜单发布,技术创新引领行业升级
  • day06 滑块进度条
  • VSCode编程插件Cline教程(超详细):安装、配置、使用教程、常见使用示例
  • 二硫化硒去屑洗发水实测推荐:深层净屑止痒,头屑人群高效护理方案
  • 2025最新污水源热泵优质服务商推荐!绿色能源解决方案权威榜单发布,技术实力引领行业发展污水源热泵公司/绿色能源技术服务商推荐
  • 2025最新水源热泵品牌推荐!高效节能水地源热泵设备权威榜单发布,技术领先企业助力绿色建筑发展水源热泵公司 / 地源热泵设备服务商推荐
  • 2025年12月西南水玻璃厂家推荐排行榜单:五家企业综合对比分析
  • 2025年12月西南水玻璃厂家推荐排行榜:基于区域供应能力与产品适用性的客观评测
  • 2025年12月选矿设备厂家综合评测排行榜:多维度对比分析助您理性选择
  • 2025最新热泵实力品牌推荐!顶尖热泵企业权威榜单发布,技术卓越服务全面助力行业发展
  • 2025年12月破碎机厂家推荐排行榜:五家优质企业综合评估与选购指南
  • 2025年12月破碎机厂家排名榜推荐:五家优质厂家深度对比与选购指南
  • 实测6款印章抠图工具,2025“一键精准分离”天花板稳坐Top1
  • 2025年面膜选购指南:针对夏季晒后与秋冬换季的强力补水舒缓修复面膜品牌推荐
  • 2025年十大优质靶向菌品牌厂家推荐,专业肠道微生态靶向菌企
  • 2025年12月加拿大海参品牌推荐排行榜:五款高性价比野生海参深度对比与选购指南
  • 2025最新电锅炉品牌推荐!国内优质电锅炉企业权威榜单发布,资质技术双优助力绿色供暖设备选择
  • Week11 Homework2
  • 2025年郑州办公室装修公司排行榜:有名的办公室装修有哪些
  • 360 T7刷机
  • GitLab特征及漏洞复现
  • JBoss中间件特征及漏洞复现
  • 大华摄像头系统特征及漏洞探测利用
  • 大华DSS系统特征及漏洞探测利用
  • 畅捷通系统特征及漏洞探测利用
  • 瑞友天翼系统特征及漏洞探测利用
  • 2025年河北公职考试培训优质品牌推荐:仕登科全阶段备考服务 高校合作保障,助力考生稳上岸!
  • 金和OA系统特征及漏洞探测利用
  • 随机动量梯度法的末点收敛性分析
  • 通达OA系统特征及漏洞探测利用