news 2026/4/15 18:42:14

(28)全注解开发底层原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(28)全注解开发底层原理

✅ 一、核心目标:

把带有@Component(及其派生注解如@Service)的类,自动注册为 Spring 容器中的 Bean,无需手动写<bean>标签。


✅ 二、实现原理(关键流程)

步骤 1:启用组件扫描

在 XML 中:

<context:component-scanbase-package="com.powernode.spring6"/>

或在 Java 配置类中:

@Configuration@ComponentScan("com.powernode.spring6")publicclassAppConfig{}

Spring Boot 中@SpringBootApplication默认包含@ComponentScan

这一步会向容器注册一个关键的后处理器:ConfigurationClassPostProcessorClassPathBeanDefinitionScanner


步骤 2:启动时扫描指定包下的所有类

Spring 使用ASM(字节码操作库)反射(取决于版本和配置)快速读取类的注解元数据,而不需要加载整个类到 JVM(避免性能问题)。

  • 扫描com.powernode.spring6及其子包
  • 找出所有.class文件
  • 检查类上是否有@Component或其派生注解(@Controller,@Service,@Repository

🔍 为什么能识别派生注解?
因为@Service的定义是:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Component// ← 关键!它是 @Component 的“派生”public@interfaceService{...}

Spring 会递归检查注解的元注解(meta-annotations),发现@Service本质是@Component


步骤 3:为每个符合条件的类生成BeanDefinition

  • 对于@Service public class UserService { ... }
  • Spring 创建一个BeanDefinition对象(通常是AnnotatedBeanDefinition
  • 设置以下信息:
    • Bean 类型UserService.class
    • Bean 名称:默认为类名首字母小写 →"userService"
      • 可通过@Service("myUser")自定义
    • 作用域(默认 singleton)
    • 是否懒加载@Lazy
    • 依赖注入信息(字段上的@Autowired@Value等,稍后处理)

📌BeanDefinition是 Spring 内部对“如何创建一个 Bean”的完整描述,相当于 XML 中<bean>标签的内存表示。


步骤 4:将BeanDefinition注册到BeanFactory

  • 所有扫描到的BeanDefinition被注册到DefaultListableBeanFactorybeanDefinitionMap
  • 后续的 Bean 实例化、依赖注入、生命周期管理都基于这些BeanDefinition

💡 此时还没有创建对象!只是注册了“配方”。


步骤 5:后续流程与 XML 方式完全一致

一旦BeanDefinition注册完成,后续流程就和 XML 配置的 Bean完全一样

  1. 实例化(new或工厂)
  2. 属性赋值(处理@Autowired,@Value
  3. 初始化(@PostConstruct,InitializingBean
  4. 使用
  5. 销毁

所以:注解只是改变了“BeanDefinition 的来源”,不改变 Bean 的生命周期流程。


✅ 三、关键支撑技术

技术作用
@Component元注解机制@Service等成为@Component的语义扩展
ClassPathScanningCandidateComponentProvider负责扫描类路径,找出候选组件
ASM / Reflection高效读取类的注解信息,避免全量类加载
BeanNameGenerator自动生成 Bean 名称(如UserServiceuserService
AutowiredAnnotationBeanPostProcessor处理@Autowired@Value等注入

✅ 四、为什么 Spring 6 倡导全注解开发?

  1. 减少 XML 配置:更简洁、更贴近 Java 代码
  2. 类型安全:编译期可检查,避免 XML 拼写错误
  3. 模块化 & 条件化:配合@Conditional实现灵活装配
  4. 与 Spring Boot 无缝集成:自动配置 + 注解 = 快速开发

✅ 总结:Spring 如何通过注解替代 XML<bean>

Spring 在启动时,通过组件扫描(@ComponentScan)自动发现带有@Component(及其派生注解)的类,将其转换为BeanDefinition并注册到容器中,后续流程与 XML 配置完全一致。

这本质上是一种“约定优于配置”的设计:

  • 约定:类上有@Service→ 就是一个 Service Bean
  • 无需配置:不用写<bean class="..."/>

因此,注解不是魔法,而是自动化生成 BeanDefinition 的一种声明式方式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 11:52:42

【稀缺资料】Open-AutoGLM定时任务配置秘籍:仅限内部流传的4种高级模式

第一章&#xff1a;Open-AutoGLM定时任务配置概述Open-AutoGLM 是一个面向自动化大语言模型任务调度的开源框架&#xff0c;支持通过声明式配置实现模型推理、数据预处理与结果后处理等任务的周期性执行。其核心功能之一是基于标准时间表达式的定时任务管理&#xff0c;允许用户…

作者头像 李华
网站建设 2026/4/14 10:29:24

拍照即知热量?Open-AutoGLM让你5分钟掌握智能饮食控制术

第一章&#xff1a;拍照即知热量&#xff1f;Open-AutoGLM开启智能饮食新时代在健康管理日益受到重视的今天&#xff0c;饮食控制成为关键一环。Open-AutoGLM 的出现&#xff0c;正在重新定义我们与食物的交互方式——只需对餐盘拍照&#xff0c;系统即可自动识别食材种类、估算…

作者头像 李华
网站建设 2026/4/15 14:45:41

Linly-Talker支持动态背景替换,视频创意无限延伸

Linly-Talker支持动态背景替换&#xff0c;视频创意无限延伸 在短视频与直播内容爆炸式增长的今天&#xff0c;一个核心问题始终困扰着创作者&#xff1a;如何以更低的成本、更快的速度&#xff0c;持续产出高质量、高吸引力的视觉内容&#xff1f;尤其对于企业宣传、在线教育、…

作者头像 李华
网站建设 2026/4/14 1:22:25

jQuery UI 实例 - 滑块(Slider)

jQuery UI Slider&#xff08;滑块&#xff09;实例 Slider 是 jQuery UI 中用于选择数值或范围的交互组件&#xff0c;常用于音量调节、价格筛选、时间选择、颜色调整等场景。支持单手柄、范围选择&#xff08;双柄&#xff09;、垂直方向、步长、动画等。 官方演示地址&…

作者头像 李华
网站建设 2026/4/10 4:10:39

Open-AutoGLM饮食热量统计实战指南(从0到1搭建个人营养AI助手)

第一章&#xff1a;Open-AutoGLM饮食热量统计Open-AutoGLM 是一个基于大语言模型的自动化数据处理框架&#xff0c;专为日常健康管理场景设计。其核心功能之一是通过自然语言输入自动解析食物摄入记录&#xff0c;并精确计算总热量。该系统结合了营养数据库与语义理解能力&…

作者头像 李华
网站建设 2026/4/13 12:27:09

jQuery UI 实例 - 自动完成(Autocomplete)

jQuery UI Autocomplete&#xff08;自动完成&#xff09;实例 Autocomplete 是 jQuery UI 中非常实用的组件&#xff0c;用于输入框提供智能建议列表&#xff0c;支持本地数据、远程 AJAX 数据、分类显示、自定义渲染等。常用于搜索框、标签输入、地址补全等场景。 官方演示…

作者头像 李华