看不懂的spring原理是因为不知道这几个概念

博客以咖啡问题类比技术工作,强调技术人员了解底层的重要性。介绍了SpringBoot,它是化简框架使用、可快速开启Web容器的框架和编程规范。还阐述了Web容器、Servlet、J2EE、Java2平台等概念,以及Web容器和Netty的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看不懂的spring原理是因为不知道这几个概念

2019年06月18日 19:00:00 静儿1986 阅读数 439

背景

问题从一杯咖啡开始。

今天我去楼下咖啡机买了一杯「粉黛拿铁」。制作过程中显示:

640?wx_fmt=png

我取了做好的粉黛拿铁,喝了一口,果然就是一杯热巧克力。咦咦咦,说好的拿铁呢?虽然我对「零点吧」的咖啡评价很高,觉得味道不亚于星爸爸。但是不可否认它确实给了我一杯假的拿铁。

现在很多技术专家好比品鉴咖啡的专家。他们并不需要知道咖啡豆和可可豆的区别,更不知道这两种植物长在树上是什么样子。没关系,这并不影响他们区别一杯咖啡是拿铁、摩卡还是卡布奇诺。就好像工作中遇到团队配合的情况,他们并不需要知道别人团队的产品是怎么实现的,只需要在他们出问题的时候让他们帮忙解决。所以,现在很多工作招高级别的人都要求良好的沟通和推动能力。技术能力反而考察的没有那么细致。

但是作为技术人员,了解底层是很重要的。因为我们不是买咖啡的,而是生产咖啡机的。有一天,咖啡机不工作了,经过分析监控报警和日志大数据,终于找到原因:一粒咖啡豆太小卡到了凹槽里。清理了这粒咖啡豆,咖啡机又正常工作了。这就结束了吗?

 

不,我们要复盘,用5Why分析法找到问题的根因。

Q:为什么咖啡机会不工作?

A:因为一粒咖啡豆卡在里凹槽里。

Q:为什么会卡在凹槽里?

A:因为这粒咖啡豆太小了,就掉下去了。

Q:为什么太小了就会掉下去?

A:因为咖啡豆基本都是圆形,咖啡豆之间有很大的空隙,彼此没有压力。只是受到重力影响,就掉下去了。

Q:为什么咖啡豆都是圆形,不能生产出方形,彼此紧密契合的咖啡豆吗?

 

这时候就是后悔不知道咖啡豆到底长在哪种树上的时间了。不了解所以没有办法做出合理的改变。

现在我们都喜欢用SpringBoot。平时工作的好好的,突然公司要求做一个基础组件的升级,咦咦咦,本地运行的好好的。发布到服务器上跑不起来。当初搭建开发基础框架的小哥早已离职,是看着那堆日志发愣呢?还是了解一下里面的基础概念顺藤摸瓜呢?废话到此为止。

 

概念

SpringBoot是什么?

SpringBoot是一个框架和编程规范。它化简了很多个框架和组件的使用,一站式简单的完成文件配置和应用部署。因为它内置服务器并装备启动类代码,可以快速开启一个Web容器。

Web容器是什么?

Web容器是一种可以处理从客户端发出请求的应用程序。在服务器中一个端口就对应一个提供相应服务的程序。在Java方面,web任凭器一般是指Servlet容器。

Servlet是什么?

Servlet只是一个接口。它声明了Servlet的生命周期的三个基本方法:init()、service()和destroy()。Web容器会在特定时间调用这些方法。Servlet是提供了一个标准,是J2EE的13个标准接口规范之一。

J2EE是什么?

J2EE(Java 2 Platfrom, Enterprise Edition)最初是一个为大企业主机级的计算类似而设计的Java平台。这个标准给提供可重用模块组件组件提供了土壤。就是定义一系列的接口,你们要实现什么功能都要在这些接口基础上。根据场景Java2平台主要包括标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本。

Java2平台是什么?

Sun公司在1998年发表JDK1.2版本的时候,使用了新名字Java 2 Platform。修改后的JDK成为Java 2 Platfrom Software Developing Kit 即J2SDK。

Web容器和Netty的关系

Web容器(如tomcat、jetty)主要处理从客户端传过来的消息,将消息分给worker线程来处理。worker线程做的事情就是通过Servlet来做的。而接受消息线程和worker线程之间的协调沟通工作目前主流是Netty来做的。

一张图大体表示一下他们的关系:

640?wx_fmt=png

总结

如果做一件事情很麻烦,那一定有一个好方法。

当用户提到“技术概念解释或代码解析”而没有明确指出具体的技术概念或代码片段时,可以考虑以下几种常见的情况以及对应的解答方式: --- ### 方法一:通用编程术语解释 许多情况下,用户可能是对常见的编程术语感到疑惑。以下是几个典型的例子及其简要说明: - **变量 (Variable)** 变量是用来存储数据值的一个命名位置。它可以在程序执行期间更改其值。 - **函数 (Function)** 函数是一段完成特定任务的代码块,可以通过调用名称重复使用以减少冗余代码。 - **类 (Class)** 和 对象 (Object) 类是一种抽象的数据结构模板,用于定义对象的行为和属性;对象则是类的具体实例。 如果需要更深入的理解,可以根据实际使用的编程语言进一步探讨实现细节。 --- ### 方法二:基础算法与数据结构概述 对于涉及计算逻辑的问题,可能是指向某些基本算法或者数据结构的概念: - **数组 (Array)** 是一种线性数据结构,其中元素按连续内存地址排列并且可通过索引访问; - **链表 (Linked List)** 包含一系列节点组成列表形式,每个节点保存一个记录及指向下一个节点链接; - 关于排序方法如快速排序 QuickSort, 归并 MergeSort 等原理也可以展开讨论。 这些知识点通常出现在初学者学习阶段或者是面试准备过程中遇到频率较高的地方。 --- ### 方法三:热门框架/库的功能介绍 有时提问者关心的是现代开发环境中广泛采用的各种开源项目特性描述。比如前端 ReactJS/Vue.js 组件生命周期钩子的作用机制;后端 Spring Boot 自动配置原理等等。下面列举两个方向供参考选择之一: #### Python Pandas 数据分析工具包入门要点 Pandas 提供高效便捷地处理表格型数据能力,核心组件 Series/DataFrame 支持多种文件读取写入功能,并内置丰富统计运算支持。 ```python import pandas as pd df = pd.read_csv('example.csv') # 加载 CSV 文件至 DataFrame 结构中 print(df.head()) # 显示前五行内容预览查看整体布局情况 ``` #### JavaScript Promise 异步控制流管理技巧 Promise 解决传统回调地狱问题,允许更加清晰直观编写异步操作序列关系。 ```javascript function fetchData() { return new Promise((resolve, reject) => { setTimeout(() => resolve("Data Loaded"), 1000); }); } fetchData().then(result => console.log(result)); // 输出 "Data Loaded" ``` --- ### 方法四:错误调试思路引导 假设问题是围绕一段已知存在问题却无法正常工作的代码,则可以从以下几个方面入手排查原因: 1. 检查语法是否正确无误; 2. 分析运行环境设置是否存在冲突限制因素影响预期效果达成; 3. 利用断点跟踪关键路径观察中间状态变化趋势找出异常所在环节。 同时附上官方文档链接方便查阅更多权威资料来源佐证结论准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值