首先Spring Boot 并没有发明新的 IoC 理论,它做的也不是替换掉 Spring IoC 容器。相反,Spring Boot 是 Spring IoC 思想的实践者和简化者。它通过**“约定优于配置”(Convention over Configuration)**的理念,将原本繁琐的 IoC 配置工作降到了最低。

我们来对比一下“没有 Spring Boot 的时代”(纯 Spring 框架)和“有了 Spring Boot 之后”的区别。


1. 没有 Spring Boot 的时代(纯 Spring 框架)

在 Spring Boot 出现之前,要搭建一个基于 Spring 的 Web 应用,你需要手动完成大量 IoC 相关的配置工作:

a. 繁琐的 XML 配置(早期)

你需要创建一个或多个 XML 文件,在里面手动定义每一个 Bean,并配置它们的依赖关系。

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 1. 必须手动开启注解扫描 --><context:component-scan base-package="com.example.myapp"/><!-- 2. 手动配置一个数据源 Bean --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="password"/></bean><!-- 3. 手动配置 JdbcTemplate,并注入 dataSource --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg ref="dataSource"/></bean><!-- 还有更多... TransactionManager, ViewResolver... -->
</beans>
b. Java 配置(后期,有所改进)

后来 Java 配置(@Configuration)取代了大部分 XML,但你仍然需要手动配置很多东西。

@Configuration
@ComponentScan("com.example.myapp") // 1. 仍然需要手动指定扫描路径
public class AppConfig {// 2. 仍然需要手动创建 DataSource Bean@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("root");dataSource.setPassword("password");return dataSource;}// ... 其他 Bean 的配置
}
c. 手动启动容器

你还需要一个 main 方法来手动加载配置,并启动 Spring IoC 容器。

public class Main {public static void main(String[] args) {// 手动创建和启动 IoC 容器ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 从容器中获取 BeanMyService myService = context.getBean(MyService.class);myService.doWork();}
}

痛点总结:

  1. 配置繁琐:大量的 Bean(如数据源、事务管理器、视图解析器)需要你像搭积木一样手动配置。
  2. 需要明确指定扫描路径@ComponentScan<context:component-scan> 必须明确告诉 Spring 去哪里找你的 Bean。
  3. 依赖管理复杂:你需要手动管理一大堆 spring-core, spring-web, spring-webmvc 等 jar 包,并确保它们的版本相互兼容,这简直是噩梦。
  4. 需要手动启动:启动容器的代码是样板化的,但每个项目都得写一遍。

2. 有了 Spring Boot 之后

Spring Boot 通过两大神器,彻底改变了这一切:Starters(启动器)Auto-Configuration(自动配置)

a. @SpringBootApplication:一个顶三个

你只需要在主类上加一个注解:

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {// 一行代码启动,所有事情都自动完成了SpringApplication.run(MyApplication.class, args);}
}

这个 @SpringBootApplication 注解其实是一个组合注解,它默认包含了:

  • @Configuration: 表明这是一个 Java 配置类。
  • @EnableAutoConfiguration: 这是 Spring Boot 的核心魔法! 它会告诉 Spring Boot 根据你 classpath(类路径)上的 jar 包,来“猜测”你可能需要什么样的配置,并自动帮你完成。
  • @ComponentScan: 自动扫描主类所在的包及其所有子包下的组件(@Component, @Service 等),你再也不用指定 base-package 了。
b. Starters:简化依赖管理

你不再需要逐个添加 Spring 的 jar 包。想用 Web 功能?只需要一个依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

这个 starter 会自动帮你引入所有相关的、且版本兼容的依赖(Spring MVC, Tomcat, Jackson 等)。想用数据库?加入 spring-boot-starter-data-jpa 即可。

c. Auto-Configuration:智能的 Bean 配置

这是对 IoC 配置的最大简化。自动配置的工作原理是:

  1. 侦测 Classpath:Spring Boot 检查你的项目中引入了哪些 Starters 和库。
  2. 条件化配置:它内部有大量的 @ConditionalOnClass, @ConditionalOnBean 等条件注解。
    • 例如:当它发现你的 classpath 中有 tomcat-embedded.jar 时(由 starter-web 引入),它就自动为你配置好一个嵌入式的 Tomcat 服务器 Bean。
    • 又例如:当它发现 classpath 中有 DataSource.class 并且你没有手动配置一个 DataSource Bean 时,它就会尝试读取 application.properties 文件中的 spring.datasource.* 属性,并自动为你创建一个 DataSource Bean。

所以,之前你需要手动配置的 DataSource,现在只需要在 application.properties 中提供几个属性就行了:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password

Spring Boot 会在幕后为你完成 @Bean 的创建和配置工作。

总结

特性纯 Spring 框架Spring Boot 如何简化
组件扫描需手动配置 <context:component-scan>@ComponentScan(basePackages=...)@SpringBootApplication 默认扫描主类及其子包,无需配置。
依赖管理需手动添加多个 jar 包并处理版本冲突。提供 Starters,只需一个依赖即可引入一套功能和兼容的版本。
通用 Bean 配置需手动配置 DataSource, TransactionManager, DispatcherServlet 等大量样板 Bean。通过 Auto-Configuration,根据 classpath 自动配置绝大多数通用 Bean。
外部配置需手动配置 PropertySourcesPlaceholderConfigurer 来读取 .properties 文件。默认支持 application.properties/.yml,直接通过 @Value@ConfigurationProperties 即可注入。
应用启动需手动编写 main 方法来创建和启动 ApplicationContext提供 SpringApplication.run() 一行代码即可启动,内嵌 Web 服务器。

总而言之,Spring Boot 并没有改变 IoC 的核心,而是为 IoC 容器穿上了一件极其智能的“自动化装甲”。它将业界沉淀下来的实践固化为“约定”和“自动配置”,让开发者从繁琐的配置工作中彻底解放,真正做到“开箱即用”,让开发者专注于业务逻辑的实现。

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

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

相关文章

Go语言中的组合式接口设计模式

文章目录Go语言中的组合式接口设计模式背景和需求组合式接口设计Go语言中的组合式接口设计模式 背景和需求 在微服务架构和复杂业务系统中&#xff0c;我们经常需要调用多个外部服务或内部模块。传统的做法是将所有方法都放在一个大接口中&#xff0c;但这种设计会导致接口臃…

React - createPortal

什么是createPortal&#xff1f;注意这是一个API&#xff0c;不是组件&#xff0c;他的作用是&#xff1a;将一个组件渲染到DOM的任意位置&#xff0c;跟Vue的Teleport组件类似。用法 import { createPortal } from react-dom;const App () > {return createPortal(<div…

Cursor的使用

Cursor的使用 Ctrl L 打开历史对话记录 Tab智能助手 1.单行/多行补全 已有代码片段&#xff1a; //需求&#xff1a;写一个工具类计算数组平均值 public class ArrayUtils {//按tab会完成补全 }按tab键- Cursor 自动生成代码: //需求&#xff1a;写一个工具类计算数组平均值 p…

17.使用DenseNet网络进行Fashion-Mnist分类

17.1 DenseNet网络结构设计import torch from torch import nn from torchsummary import summary #卷积层 def conv_block(input_channels,num_channels):netnn.Sequential(nn.BatchNorm2d(input_channels),nn.ReLU(),nn.Conv2d(input_channels,num_channels,kernel_size3,pad…

网安系列【16】之Weblogic和jboss漏洞

文章目录一 Weblogic1.1 Weblogic相关漏洞1.2 Weblogic漏洞发现1.3 Weblogic漏洞利用二 Jboss2.1 Jboss漏洞2.2 Jboss识别与漏洞利用一 Weblogic WebLogic 是由 Oracle公司 开发的一款基于Java EE&#xff08;现称Jakarta EE&#xff09;的企业级应用服务器&#xff0c;主要用…

Unity URP + XR 自定义 Skybox 在真机变黑问题全解析与解决方案(支持 Pico、Quest 等一体机)

在使用 Unity 的 URP 渲染管线开发 XR 应用&#xff08;如 Pico Neo、Pico 4、Quest 2/3 等一体机&#xff09;时&#xff0c;很多开发者遇到一个奇怪的问题&#xff1a;打包后&#xff0c;Skybox&#xff08;天空盒&#xff09;在某些角度下突然变黑&#xff0c;只在转动头部后…

Cursor、飞算JavaAI、GitHub Copilot、Gemini CLI 等热门 AI 开发工具合集

Cursor&#xff1a;代码编写的智能伙伴​Cursor 是 Anysphere 公司推出的一款 AI 编程工具&#xff0c;它基于微软开源代码编辑器 VS Code 开发&#xff0c;将 AI 技术深度整合到开发人员的工作流程中。Cursor 的功能十分强大&#xff0c;不仅能够自动用纯英文编写代码&#xf…

如何安装历史版本或指定版本的 git

背景 有的时候&#xff0c;我们需要安装指定版本的git&#xff0c;或者希望旧一点的&#xff0c;毕竟我就遇到最新的2.50.1在win10安装后打开就一闪而过&#xff0c;而安装2.49.1就不会 下载 官网可能比较难找&#xff0c;但是这个github仓库&#xff1a;https://github.com/gi…

LaCo: Large Language Model Pruning via Layer Collapse

发表&#xff1a;EMNLP_FINDING_2024 机构&#xff1a;Shanghai Jiao Tong University 连接&#xff1a;LaCo: Large Language Model Pruning via Layer Collapse - ACL Anthology 代码&#xff1a;https://github.com/yangyifei729/LaCo Abstract 基于 Transformer 的大语…

服务器内核级故障排查

目录 **检查内核级故障(Oops/Panic)的具体操作步骤****1. 查看完整 `dmesg` 日志(含时间戳)****2. 过滤关键错误信息****3. 检查系统日志中的内核消息****4. 分析最近一次启动的日志****5. 检查是否有 `vmcore` 转储文件****常见内核错误示例及含义**补充说明:检查内核级故…

Flink学习笔记:整体架构

开一个新坑&#xff0c;系统性的学习下 Flink&#xff0c;计划从整体架构到核心概念再到调优方法&#xff0c;最后是相关源码的阅读。 今天就来学习 Flink 整体架构&#xff0c;我们先看官网的架构图图中包含三部分&#xff0c;分别是 Client、JobManager 和 TaskManager。其中…

【LeetCode 热题 100】105. 从前序与中序遍历序列构造二叉树——(解法二)O(n)

Problem: 105. 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 【LeetCode 热题 100】105. 从前序与中序遍历序列构…

完美卸载 Ubuntu 双系统:从规划到实施的完整指南

&#x1f4d6; 前言 最近成功完成了一次 Ubuntu 双系统的完整卸载&#xff0c;从最初的分区删除到最终解决 GRUB 引导问题&#xff0c;整个过程虽然有些曲折&#xff0c;但最终完美解决。本文将详细分享整个卸载过程&#xff0c;希望能帮助到有类似需求的朋友。 &#x1f3af…

深入理解oracle ADG和RAC

1. 引言 本节详细介绍oracle ADG和RAC。当然这里讲得的详细是相对理论的深入&#xff0c;不涉及到实验&#xff0c;比如ADG和RAC的搭建及调优等。 RAC (Real Application Clusters) 和 ADG (Active Data Guard)是Oracle 的两大核心高可用和灾备技术。它们是 Oracle 数据库高可用…

网络安全实践:从环境搭建到漏洞复现

要求&#xff1a;1.搭建docker2.使用小皮面板搭建pikachu靶场3.使用BP的爆破模块破解pikachu的登陆密码步骤4.Kail的msf复现永恒之蓝一.搭建docker1. Docker介绍Docker 是容器&#xff0c;可以部分完全封闭。封闭意味&#xff1a;一个物质&#xff08;放到容器&#xff09;&…

车载诊断架构 --- 诊断功能开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

mysql数据库知识

MySQL数据库详解MySQL是目前全球最流行的关系型数据库管理系统之一&#xff0c;以其开源免费、高效稳定、易于扩展等特点&#xff0c;被广泛应用于Web开发、企业级应用等场景。本文将从基础概念、核心特性到实际应用&#xff0c;对MySQL进行全面解析。一、MySQL的基本概念1. 关…

基于springboot的美食文化和旅游推广系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

Rust赋能文心大模型4.5智能开发

文心大模型4.5版本概论 文心大模型4.5是百度推出的最新一代大规模预训练语言模型,属于文心大模型(ERNIE)系列。该模型在自然语言处理(NLP)、多模态理解与生成等领域表现出色,广泛应用于智能搜索、内容创作、对话交互等场景。 核心能力 语言理解与生成 支持复杂语义理解…

前端抓包(不启动前端项目就能进行后端调试)--whistle

1、安装 1.1.安装node.js 1.2.安装whistle npm install -g whistle2.安装浏览器插件【SwitchyOmega】在谷歌浏览器应用商店下载安装即可配置proxy127.0.0.1:8989是w2 start的端口号启用代理3.启动服务&#xff08;每次抓包都得启动&#xff09; w2 start点击链接访问网页 http:…