文章目录

    • 1.1 IoC容器:Spring的智能管家
    • 1.2 注解驱动:给管家下指令
      • 1.2.1 @SpringBootApplication:总管家的聘书
      • 1.2.2 组件注解:员工的身份标识
      • 1.2.3 @Autowired:依赖注入的三种方式
      • 1.2.4 @Bean注解:手动招聘特殊人才
    • 1.3 自动配置:管家的智能决策
      • 1.3.1 条件装配:智能的情境判断
      • 1.3.2 源码揭秘:自动配置的工作原理
    • 1.4 实战示例:构建一个简单的公司系统
    • 1.5 总结:注解驱动的IoC优势

1.1 IoC容器:Spring的智能管家

想象一下,你是一家大公司的CEO,而Spring IoC容器就是你的私人智能管家。传统开发中,你需要自己记住每个员工的联系方式,自己安排会议,自己协调资源——这就像在代码中频繁使用new关键字创建对象:

// 没有管家的苦日子
Employee developer = new Developer();
Employee manager = new Manager();
Project project = new Project(developer, manager);

而有了Spring这位智能管家,你只需要告诉他:“我需要一个项目经理”,管家就会自动找到最合适的人选并送到你面前:

// 有管家的幸福生活
@Autowired
private Project project; // 管家,帮我组建一个项目团队!

源码视角
Spring的核心容器是ApplicationContext接口,它的默认实现AnnotationConfigApplicationContext就是专门处理注解的智能管家:

// 启动Spring容器(聘请管家)
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 向管家索取需要的服务
ProjectService projectService = context.getBean(ProjectService.class);

1.2 注解驱动:给管家下指令

在Spring Boot中,我们主要通过注解来指导管家工作。这些注解就像给管家的工作指令

1.2.1 @SpringBootApplication:总管家的聘书

这是Spring Boot应用的起点注解,它实际上是一个组合注解

@SpringBootApplication // ← 这就是聘书,包含三个重要指令
public class CompanyApplication {public static void main(String[] args) {SpringApplication.run(CompanyApplication.class, args); // 正式聘请管家}
}

拆解这个"聘书",包含三个核心指令:

@SpringBootConfiguration  // ← 指令1:这是家正规公司(配置类)
@EnableAutoConfiguration  // ← 指令2:管家可以自主决策(自动配置)
@ComponentScan            // ← 指令3:在公司内寻找人才(组件扫描)
public class CompanyApplication {// ...
}

1.2.2 组件注解:员工的身份标识

在公司里,不同类型的员工有不同的工牌:

@Component         // ← 普通员工工牌
public class Developer {public void code() {System.out.println("编写代码...");}
}@Service           // ← 管理层工牌(特殊待遇)
public class ProjectService {private final Developer developer;public ProjectService(Developer developer) {this.developer = developer;}
}@Repository        // ← 仓库管理员工牌(有错误转换特权)
public class ProjectRepository {// 数据访问逻辑
}@Controller        // ← 前台接待员工牌(处理外部请求)
public class ProjectController {private final ProjectService projectService;public ProjectController(ProjectService projectService) {this.projectService = projectService;}
}

源码洞察
这些注解都被元注解@Component标记,意味着它们都会被组件扫描发现:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // 所有注解都是@Component的特殊化
public @interface Service {// ...
}

1.2.3 @Autowired:依赖注入的三种方式

告诉管家如何给员工配备助手和设备:

@Service
public class ProjectService {// 方式1:字段注入(直接配助手)- 简单但不推荐@Autowiredprivate Developer developer;// 方式2:构造器注入(招聘时指定助手)- 推荐方式private final Designer designer;@Autowiredpublic ProjectService(Designer designer) {this.designer = designer; // 一旦配备,不可更改}// 方式3:Setter注入(后期配置设备)- 可选依赖private Printer printer;@Autowiredpublic void setPrinter(Printer printer) {this.printer = printer; // 可以后期更换}
}

最佳实践:使用构造器注入,就像在招聘时就确定团队组成,这样团队更稳定。

1.2.4 @Bean注解:手动招聘特殊人才

有些特殊人才(第三方库的类)没有Spring的工牌,我们需要手动招聘:

@Configuration // ← 人力资源部
public class CompanyConfig {@Bean // ← 手动签发聘书public SpecialExpert specialExpert() {return new SpecialExpert(); // 来自第三方库的专家}@Beanpublic ProjectTeam projectTeam(Developer developer, SpecialExpert expert) {// 管家会自动提供需要的依赖return new ProjectTeam(developer, expert);}
}

1.3 自动配置:管家的智能决策

Spring Boot最强大的特性就是自动配置。这就像管家根据公司环境自动做出最佳决策:

1.3.1 条件装配:智能的情境判断

@Configuration
public class SmartConfiguration {// 只有当公司有数据库时,才招聘DBA@Bean@ConditionalOnClass(DataSource.class)public DatabaseAdmin databaseAdmin() {return new DatabaseAdmin();}// 只有当需要处理Web请求时,才配备Web团队@Bean@ConditionalOnWebApplicationpublic WebTeam webTeam() {return new WebTeam();}// 只有当配置了邮件服务器时,才设立邮件部门@Bean@ConditionalOnProperty(name = "mail.host")public EmailService emailService() {return new EmailService();}
}

1.3.2 源码揭秘:自动配置的工作原理

Spring Boot的自动配置是通过spring-boot-autoconfigure包中的META-INF/spring.factories文件实现的:

# spring.factories文件内容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaAutoConfiguration

每个自动配置类都使用条件注解来决定是否生效:

@Configuration
@ConditionalOnClass(DataSource.class) // 有数据库驱动才生效
@ConditionalOnProperty(prefix = "spring.datasource", name = "url") // 配置了URL才生效
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置属性
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBean // 如果没有自定义DataSource才创建public DataSource dataSource(DataSourceProperties properties) {return properties.initializeDataSourceBuilder().build();}
}

1.4 实战示例:构建一个简单的公司系统

让我们用代码来演示Spring Boot如何基于注解管理IoC容器:

// 1. 启动类(公司总部)
@SpringBootApplication
public class CompanyApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(CompanyApplication.class, args);// 从容器中获取beanProject project = context.getBean(Project.class);project.start();}
}// 2. 服务层(管理部门)
@Service
public class ProjectService {private final Developer developer;private final Designer designer;// 构造器注入public ProjectService(Developer developer, Designer designer) {this.developer = developer;this.designer = designer;}public void startProject() {developer.code();designer.design();}
}// 3. 组件类(员工)
@Component
public class Developer {public void code() {System.out.println("程序员编写代码...");}
}@Component
public class Designer {public void design() {System.out.println("设计师设计界面...");}
}// 4. 配置类(人力资源部)
@Configuration
public class CompanyConfig {@Beanpublic Project project(ProjectService projectService) {return new Project(projectService);}
}// 5. 项目类
public class Project {private final ProjectService projectService;public Project(ProjectService projectService) {this.projectService = projectService;}public void start() {System.out.println("项目启动!");projectService.startProject();}
}

1.5 总结:注解驱动的IoC优势

通过注解驱动的方式,Spring Boot实现了:

  1. 简洁性:几个注解替代了大量XML配置
  2. 类型安全:编译期就能发现错误,而不是运行时
  3. 强一致性:注解与代码在一起,不会出现配置与代码不同步
  4. 智能自动配置:根据环境自动做出最佳决策

就像一位聪明的管家,Spring Boot通过注解了解你的需求,自动协调所有资源,让你可以专注于业务逻辑而不是基础设施的搭建。

记住这个比喻

  • @Component@Service@Repository@Controller → 员工工牌
  • @Autowired → 给员工配备助手和设备
  • @Bean → 手动招聘特殊人才
  • @Conditional → 管家的情境智能决策
  • @SpringBootApplication → 总管家的聘书

有了这位智能管家,你的开发效率将大幅提升,真正实现"约定优于配置"的开发理念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95645.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95645.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95645.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】92.翻转链表Ⅱ--通俗讲解

一、题目是啥?一句话说清 给你一个链表和两个整数 left 和 right,反转从第 left 个节点到第 right 个节点的子链表,并返回反转后的链表。其他部分保持不变。 示例: 输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5](反转了从第2到第4个节点) 二、解题…

Nature子刊:新发现!深层脑网络中发现强迫症症状的神经生物标志物

强迫症(OCD)是一种令人困扰的精神疾病,患者常常被强迫思维和强迫行为所困扰。例如,有些人会反复洗手,无法控制自己的清洁冲动;还有些人会不断检查门窗是否关好,即便他们已经确认过无数次。这些行…

Onlyoffice集成与AI交互操作指引(Iframe版)

Onlyoffice集成与AI交互操作指引(Iframe版) 本文档系统介绍了软件系统集成OnlyOffice实现在线编辑与AI辅助功能的方案。主要内容包括:后端需提供文档配置信息并实现Callback接口以处理文档保存;前端通过Vue集成编辑器&#xff0c…

TypeScript 中 keyof、typeof 和 instanceof

在 TypeScript 开发中,keyof、typeof 和 instanceof 是核心的类型操作符和操作符,专门用于提升类型安全、代码可读性和维护性。1. keyof 操作符定义和用途:keyof 是一个类型操作符,用于获取对象类型的所有键(属性名&am…

分布式专题——1.1 Redis单机、主从、哨兵、集群部署

1 Redis 部署 下面演示在 Linux 环境下部署 Redis7。 1.1 单机部署 1.1.1 检查安装 gcc 环境Redis 是由 C 语言编写的,它的运行需要 C 环境,因此我们需要先安装 gcc; # 关闭防⽕墙 systemctl stop firewalld.service # 查看防火墙状态 firewa…

2025年渗透测试面试题总结-54(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。1、SQL注入的防护方法有哪些? 2、永恒之蓝的漏洞原理是什么?怎么做到的? 3、命令…

安卓学习 之 按钮点击事件

今天学习安卓应用中的按钮点击事件:总结下来在安卓应用中的Button注册点击事件的方法主要是以下4种方法,稍后会逐个介绍: 第一种方法:自定义内部类的方法 第二种方法:匿名内部类的方法 第三种方法:当前Acti…

鸿蒙NEXT主题设置指南:应用级与页面级主题定制详解

在鸿蒙应用开发中,灵活的主题设置能力是实现个性化用户体验的关键技术,HarmonyOS NEXT提供了强大而灵活的主题设置功能,让开发者能够轻松实现应用级和页面级的主题定制。在当今追求个性化的时代,用户希望应用能够根据自己的喜好呈…

全球汽车氮化镓技术市场规模将于2031年增长至180.5亿美元,2025-2031年复合增长率达94.3%,由Infineon和Navitas驱动

全球汽车氮化镓技术市场规模将于2031年增长至180.5亿美元,2025-2031年复合增长率达94.3%,由Infineon和Navitas驱动汽车氮化镓技术正从一个有前景的细分市场加速进入主流电力电子领域。根据QYResearch(恒州博智)的《全球汽车GaN技术…

xftp断网后提示错误如何继续下载?

问题:xftp断网后提示错误如何继续下载?解决方法:断网后,先连接上网,然后继续双击右侧的那两个要传输的文件,然后会弹出一个覆盖还是继续下载(如下图)的选择框,选择继续下…

Day22_【机器学习—集成学习(4)—Boosting—GBDT算法】

提升树 (Boosting Decision Tree )每一个弱学习器通过拟合残差来构建强学习器梯度提升树 (Gradient Boosting Decision Tree)每一个弱学习器通过拟合负梯度来构建强学习器一、提升树残差数学公式为:残差真实值−预测值…

前缀和、子矩阵的和;差分、差分矩阵

一、前缀和数组要稍微注意前缀和数组从1开始#include <iostream>using namespace std;const int N 100010;int n, m; int a[N], s[N];int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i ) scanf("%d", &a[i]);for (int i…

启用BBR拥塞控制算法

目录 &#x1f4cb; 先决条件 &#x1f527; 启用步骤 &#x1f4dd; 额外检查与说明 ⚠️ 注意事项 BBR&#xff08;Bottleneck Bandwidth and Round-trip time&#xff09;是谷歌开发的一种TCP拥塞控制算法&#xff0c;它能有效提升网络传输速度和性能&#xff0c;尤其在…

Python:AI开发第一语言的全面剖析

文章目录引言1. Python的历史与AI开发的契合1.1 Python的诞生与设计哲学1.2 Python与AI发展的历史交汇2. 语言特性如何支持AI开发2.1 动态类型与交互式编程2.2 简洁优雅的语法2.3 高级数据结构的原生支持2.4 函数式编程特性2.5 强大的元编程能力3. 丰富的AI生态系统和库支持3.1…

Nikto 漏洞扫描工具使用指南

目录 ✨ 核心功能一览 &#x1f680; 基本使用方法 1. 扫描单个目标 2. 指定端口扫描 3. 扫描 HTTPS 目标 使用 -ssl 参数主要有两个核心原因 ⚙️ 高级使用技巧 1. 使用代理扫描 2. 保存扫描结果 3. 使用特定插件 4.交互命令 ✨ 核心功能一览 Nikto 是一款开源的 W…

FunASR的Java实现Paraformer实时语音识别 | 一款无需联网的本地实时字幕软件

0. 开发背景 我们在看直播时&#xff0c;没有视频字幕&#xff0c;可能看惯了视频字幕&#xff0c;来到直播中缺少字幕会感觉不习惯&#xff0c;特别是对于听力障碍的人群&#xff0c;只能依赖于字幕&#xff0c;那么这个软件可以解决直播&#xff0c;在线会议等场景中无字幕的…

从机器学习的角度实现 excel 中趋势线:揭秘梯度下降过程

1. 引言&#xff1a;Excel 的“一键魔法”背后藏着什么智慧&#xff1f;在 Excel 中&#xff0c;我们只需右键 → 添加趋势线&#xff0c;一条完美的直线就出现了。它快得像魔法&#xff0c;但魔法背后&#xff0c;是数学的严谨。今天&#xff0c;我们不关心 Excel 内部用了什么…

关于上拉电阻

上拉电阻的作用&#xff1a;辅助浮空状态输出高电平 其实就是确定这根线的电平&#xff0c;不能让他处于一种未知的状态。 其次也可以起到限制电流的作用&#xff0c;防止损坏原件 那么上拉电阻如何取值&#xff1f; 首先来看一下驱动能力。 因为线上是一定有寄生电容的&am…

PiscCode构建Mediapipe 手势识别“剪刀石头布”小游戏

在计算机视觉与人机交互领域&#xff0c;手势识别是一个非常有趣的应用场景。本文将带你用 Mediapipe 和 Python 实现一个基于摄像头的手势识别“剪刀石头布”小游戏&#xff0c;并展示实时手势与游戏结果。 1. 项目概述 该小游戏能够实现&#xff1a; 实时检测手势&#xff0…

【VoNR】VoNR 不等于 VoLTE on 5G

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…