【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官网
  • 《微服务从小白到专家》 姚秋晨 张昕 卿睿著
相关文章
|
18天前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
|
29天前
|
数据采集 监控 JavaScript
移动端性能监控探索:鸿蒙 NEXT 探针架构与技术实现
阿里云 ARMS 团队倾力打造的鸿蒙 NEXT SDK,为鸿蒙应用提供了业界领先的全链路监控解决方案。这不仅仅是一个 SDK,更是您洞察用户体验、优化应用性能的智能伙伴。
370 21
|
14天前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
179 1
|
1月前
|
JSON 供应链 监控
1688商品详情API技术深度解析:从接口架构到数据融合实战
1688商品详情API(item_get接口)可通过商品ID获取标题、价格、库存、SKU等核心数据,适用于价格监控、供应链管理等场景。支持JSON格式返回,需企业认证。Python示例展示如何调用接口获取商品信息。
|
20天前
|
机器学习/深度学习 自然语言处理 监控
23_Transformer架构详解:从原理到PyTorch实现
Transformer架构自2017年Google发表的论文《Attention Is All You Need》中提出以来,彻底改变了深度学习特别是自然语言处理领域的格局。在短短几年内,Transformer已成为几乎所有现代大型语言模型(LLM)的基础架构,包括BERT、GPT系列、T5等革命性模型。与传统的RNN和LSTM相比,Transformer通过自注意力机制实现了并行化训练,极大提高了模型的训练效率和性能。
|
1月前
|
数据可视化 前端开发 数据管理
什么是低代码?一文看懂:低代码技术的发展历程及技术架构
低代码开发平台通过可视化界面与组件化设计,大幅降低编程门槛,使开发者无需大量编码即可快速构建应用。它具备可视化开发、预制组件、低技术门槛及全流程支持等核心特征,适用于业务流程自动化、数据管理、客户关系管理等多种场景。自萌芽期至今,低代码不断演进,成为企业数字化转型的重要工具,显著提升开发效率、降低成本,并推动全民开发者时代的到来。
440 0
什么是低代码?一文看懂:低代码技术的发展历程及技术架构
|
1月前
|
前端开发 Java 开发者
MVC 架构模式技术详解与实践
本文档旨在全面解析软件工程中经典且至关重要的 MVC(Model-View-Controller) 架构模式。内容将深入探讨 MVC 的核心思想、三大组件的职责与交互关系、其优势与劣势,并重点分析其在现代 Web 开发中的具体实现,特别是以 Spring MVC 框架为例,详解其请求处理流程、核心组件及基本开发实践。通过本文档,读者将能够深刻理解 MVC 的设计哲学,并掌握基于该模式进行 Web 应用开发的能力。
234 1
|
1月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
299 0
|
XML Java 数据格式
SpringBoot(高级原理分析)(下)
SpringBoot(高级原理分析)(下)
420 0
SpringBoot(高级原理分析)(下)
|
Java 应用服务中间件 Redis
SpringBoot(高级原理分析)(上)
SpringBoot(高级原理分析)(上)
217 0
SpringBoot(高级原理分析)(上)