Spring Boot启动注解的底层和@Autowired底层的实现

目录

[1. @SpringBootApplication 的底层实现](#1. @SpringBootApplication 的底层实现)

[2. @Autowired 的底层实现](#2. @Autowired 的底层实现)

总结


Spring Boot 和 Spring Framework 中的 @SpringBootApplication@Autowired 注解是 Spring 生态系统中非常重要的部分,它们分别用于简化 Spring 应用的启动过程和实现依赖注入。下面将分别探讨这两个注解的底层实现。

1. @SpringBootApplication 的底层实现

@SpringBootApplication 是一个方便的注解,它包含了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan 这三个注解的功能。

  • @SpringBootConfiguration :这个注解是 @Configuration 的一个特殊形式,用于标记当前类是一个 Spring Boot 的配置类。@Configuration 注解表明该类是一个配置类,可以使用 @Bean 注解来定义和初始化 Spring 容器中的 bean。

  • @EnableAutoConfiguration :这个注解告诉 Spring Boot 根据添加的 jar 依赖自动配置 Spring 应用。它通过 spring.factories 文件中的 EnableAutoConfiguration 入口点来查找并加载自动配置类。这些自动配置类使用 @Conditional 注解来确保只有在满足特定条件时才会被应用。

  • @ComponentScan:这个注解告诉 Spring 在包和子包中查找其他组件、配置和服务,以便自动发现和注册为 Spring 应用上下文中的 bean。

2. @Autowired 的底层实现

@Autowired 注解用于自动装配 Spring 容器中的 bean。它可以用在构造器、字段、setter 方法上,以及配置方法上。

  • 实现机制@Autowired 的实现依赖于 Spring 的依赖注入(DI)容器。当 Spring 容器启动时,它会扫描带有 @Component@Service@Repository 等注解的类,并将这些类的实例作为 bean 注册到容器中。然后,当 Spring 容器处理带有 @Autowired 注解的字段、构造器或方法时,它会查找与注解的字段、参数类型相匹配的 bean,并将这些 bean 注入到相应的位置。

  • 查找过程 :如果 Spring 容器中存在多个与 @Autowired 注解字段或参数类型相匹配的 bean,它会根据类型匹配和名称匹配(如果指定了 @Qualifier 注解)来确定要注入的 bean。如果没有找到匹配的 bean,Spring 容器会抛出异常,除非使用了 @Autowired(required = false),此时会忽略该字段或参数,不进行注入。

  • 基于 Java 的配置 :除了注解方式,Spring 还支持基于 Java 的配置方式,通过 @Bean 注解在配置类中定义 bean,并通过 @Autowired 注解自动装配这些 bean。

总结

@SpringBootApplication@Autowired 是 Spring Boot 和 Spring Framework 中非常重要的注解,它们分别用于简化 Spring 应用的启动过程和实现依赖注入。@SpringBootApplication 通过组合多个注解来提供自动配置和组件扫描的功能,而 @Autowired 则通过 Spring 的依赖注入机制来自动装配 bean。这两个注解的底层实现都依赖于 Spring 的容器和自动配置机制。

相关推荐
276695829217 分钟前
tiktok 弹幕 逆向分析
java·python·tiktok·tiktok弹幕·tiktok弹幕逆向分析·a-bogus·x-gnarly
用户403159863966333 分钟前
多窗口事件分发系统
java·算法
用户403159863966336 分钟前
ARP 缓存与报文转发模拟
java·算法
小林ixn39 分钟前
大一新手小白跟黑马学习的第一个图形化项目:拼图小游戏(java)
java
nbsaas-boot1 小时前
Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
java·开发语言·golang
MarkGosling1 小时前
【开源项目】网络诊断告别命令行!NetSonar:开源多协议网络诊断利器
运维·后端·自动化运维
hi0_61 小时前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
congvee1 小时前
springboot 学习第1期 - 创建工程
spring boot
Codebee1 小时前
OneCode3.0 VFS分布式文件管理API速查手册
后端·架构·开源
朝如青丝暮成雪_1 小时前
java的三大特征
java