【SpringBoot学习笔记】(技术细节、架构、原理篇)(1)历史及简介

简介: 本文是个人的SpringBoot学习笔记。
本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。

前身——Spring

对EJB规范(Enterprise Java Beans)的颠覆

EJB规范的缺点:程序员需要耗费大量时间精力实现该规范所要求的各种类,还要管理其生命周期,违背了“将精力放在业务功能本身上”的初衷。

为了解决这个问题,就有了Spring系列。

Spring核心概念

IoC(inversion of control)和DI(dependency injection)

从本质上看,IoC和DI描述的是同一个事情,都是使得被依赖着不再由依赖者直接创建,而是由专门的 容器 来管理,从而实现解耦。

AOP(aspect(切面) oriented programming)

什么是切面

切面是一组模块化的且可以被多个类复用的逻辑。

什么时候用切面?

当目标对象的一段程序在某个执行点的切入点被判定为真时,切面逻辑会被触发执行,并将切面和目标对象连接在一起,这个过程被称为weaving(织入)

作用

将业务逻辑和非业务逻辑分离

Q:SpringAOP和AspectJ的异同及联系?

同:AspectJ由Eclipse基金会发布,也是AOP思想的实现。
异:两者实现的原理以及最终目标不同。

  • SpringAOP可根据runtime的不同状态在java的动态代理技术或CGLIB代理技术之间切换;而AspectJ是在编译期和类装载期织入。
  • Spring系只是简单实现了Spring框架需要的AOP功能,而AspectJ是一个大而全的Java实现。

联系:Spring框架也支持AspectJ。

SpringBoot设计理念

Convention Over Configuration(约定大于配置)

大部分项目的配置都是相似的,所以可以将最佳实践(指业界专家大佬的经验)和默认配置进行自动化装配,如管理Spring应用中的各类Bean。

SpringBoot核心1——SpringBoot Starter

  • 用途:作为“开始”,它可以很方便地帮助人们创建项目,能用Maven Archetype做的事情,用Spring Initializer(就是官网上的那个项目创建页)一样能做,而且更方便,不需要程序员考虑集成软件时的版本兼容问题。
  • 实现:所有依赖被预先定义到pom.xml中,引用starter后,所需依赖就能自动添加到项目中。

starter的使用如图所示:

image.png

SpringBoot核心2——Auto Configuration

体现:以在pom.xml中增加一项配置为例

(昨晚我初次创建SpringBoot项目时,发现无法引用@RestController,经上网搜索解决方案,在pom.xml的依赖配置中新增了以下一项,再启动就成功了)

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

这个过程发生了什么

除了pom中的配置外,我并没有增加别的代码或配置,这说明SpringBoot自动完成了相应Bean的装配工作,减少了我设置配置文件的工作量。过程如下:

  • 应用启动时,扫描项目classpath中存在的框架类。
  • 检查显式配置。
  • 结合Condition自动完成相应Bean的装配。而Condition和@Conditional注解相联系,从而控制某个Bean是否被加载。

如何实现自动配置?

通过对源码分析可知:SpringBoot利用Condition对各种常用的开源框架定义了AutoConfiguration类,并将其放在spring-boot-autoconfigure-2.*.jar/META-INF/spring.factories中。项目启动时,会按照相应的condition判断是否需要注册相应的类到Spring Context。

(源码分析路径:EnableAutoConfiguration类,AutoConfigurationImportSelector类,spring-boot-autoconfigure-2.*.jar/META-INF/spring.factories)

SpringBoot核心3——Properties

  • 加载配置项:@ConfigurationProperties
  • 加载除默认的application.properties外的其他配置文件:@PropertySource
  • 默认配置的寻址路径是从里到外(从当前目录一直寻到根目录),其中最先开始找的优先级最高。虽然最后会采用最开始找到的那个,但并不是因为找到了就停止寻找,只是因为后面找到的优先级低,而高优先级会覆盖低优先级。
  • YML优先级高于application.properties
  • 可通过spring.config.name和spring.config.location改变SpringBoot配置的默认行为。

application.properties注入顺序

(越靠前优先级越高)

  • Devtools
  • @TestPropertySource
  • @SpringBootTest
  • 命令行指定参数。优先级:Java>spring
  • Servlet相关。优先级:Config>Context
  • JNDI
  • Java系统参数
  • 操作系统环境变量
  • RandomValuePropertySource随机数
  • jar包外的配置文件
  • @Configuration 上的@PropertySource参数
  • SpringApplication.setDefaultProperties

profile(spring框架本身就有)

  • 作用:将环境隔离开来。如开发环境和生产环境
  • 使用方法:可以添加多个不同的配置文件,并在启动应用时通过启动参数指定profile加载不同的文件。

spring.profiles.active=xx(yy)

SpringBoot核心4——Actuator

使用场景

项目已经部署上线,发现有问题,无法直接调试。

基础方案:JMX(Java Management Extension)

在SpringBoot中的封装方案:通过Actuator暴露和访问JMX的MBean。

配置方式

  • 在pom.xml中添加actuator相关的内容

效果

运行之后可以发现,控制台输出多了这一项:

image.png

点开Endpoint,可以看到如下内容:

image.png

可以通过在浏览器输入对应网址/点击选项中的内容选择用浏览器打开,查看结果。

如查看health时,该结果表示容器状况良好,运行正常。

image.png

两点注意事项:

  • 控制某个endpoint开放还是关闭:

在application.properties中添加如下代码:
management.endpoint.{endpointName}.enabled:true/false

  • 发现某个endpoint通过web直接访问时404 not found,如metrics:
management.endpoints.web.exposure.include=metrics

设置成功后网页如图所示
image.png

SpringBoot核心5——Embedded Container

SpringBoot无需配置容器,因为它内置了容器。

也可以通过一些操作将内置的容器换掉或者使SpringBoot部署在独立容器中。(不过我还暂时没有这方面的需求,就先放一放了,等用到再去了解操作,现在要知道理论上是可行的)

参考文献

  • SpringBoot官网
  • 《微服务从小白到专家》 姚秋晨 张昕 卿睿著
相关文章
|
23天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
1月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
1月前
|
人工智能 前端开发 编译器
【AI系统】LLVM 架构设计和原理
本文介绍了LLVM的诞生背景及其与GCC的区别,重点阐述了LLVM的架构特点,包括其组件独立性、中间表示(IR)的优势及整体架构。通过Clang+LLVM的实际编译案例,展示了从C代码到可执行文件的全过程,突显了LLVM在编译器领域的创新与优势。
62 3
|
26天前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
146 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
5天前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
32 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
14天前
|
决策智能 数据库 开发者
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
本项目旨在解决智能体的“超级入口”问题,通过开发基于意图识别的多智能体框架,实现用户通过单一交互入口使用所有智能体。项目依托阿里开源的Qwen2.5大模型,利用其强大的FunctionCall能力,精准识别用户意图并调用相应智能体。 核心功能包括: - 意图识别:基于Qwen2.5的大模型方法调用能力,准确识别用户意图。 - 业务调用中心:解耦框架与业务逻辑,集中处理业务方法调用,提升系统灵活性。 - 会话管理:支持连续对话,保存用户会话历史,确保上下文连贯性。 - 流式返回:支持打字机效果的流式返回,增强用户体验。 感谢Qwen2.5系列大模型的支持,使项目得以顺利实施。
203 8
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
|
15天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
22天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
76 14
|
1月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。