spring 、springboot 运行的原理、理解、分析

Spring 和 Spring Boot 是非常流行的 Java 框架,它们的运行原理和设计哲学帮助开发者构建现代化的企业级应用。在这里,我们将深入探讨它们的运行原理、设计理念及其背后的机制。

Spring 框架

1. 核心概念和组件

IoC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)

  • IoC:控制反转是一种设计原则,它将对象的控制权从代码中剥离出来,交给框架来管理。
  • DI:依赖注入是 IoC 的具体实现方式之一,通过注入所需的依赖对象来减少组件间的耦合。

Bean:Spring 中的每一个对象都是一个 Bean。Bean 是由 Spring IoC 容器管理的对象。

ApplicationContext:Spring IoC 容器的核心接口,负责实例化、配置和组装 Bean。

2. Spring IoC 容器的工作原理
  1. 配置文件解析:Spring IoC 容器通过 XML 文件或注解配置来定义 Bean 和它们之间的依赖关系。

  2. Bean 定义注册:解析配置文件后,Spring 将 Bean 的定义信息保存到一个内部的数据结构(如 BeanDefinition)。

  3. 实例化和依赖注入

    • 实例化:根据 Bean 的定义,Spring IoC 容器创建 Bean 的实例。
    • 依赖注入:在实例化过程中,Spring IoC 容器会注入所需的依赖(构造器注入、Setter 注入或字段注入)。
  4. 生命周期管理:Spring 管理 Bean 的生命周期,包括初始化和销毁方法的调用。

3. AOP(Aspect-Oriented Programming,面向切面编程)

AOP 允许开发者在不修改代码的情况下,将横切关注点(如日志记录、事务管理等)分离出来。

  • Aspect:切面,包含横切关注点的逻辑。
  • Join Point:程序执行的某个点,如方法调用。
  • Advice:在特定 Join Point 执行的动作。
  • Pointcut:定义 Advice 应用的 Join Point。
4. 数据访问与事务管理

Spring 提供了对 JDBC、Hibernate、JPA 等持久化框架的支持,并提供统一的编程模型。事务管理允许开发者声明式地管理事务。

Spring Boot

Spring Boot 是基于 Spring 的快速开发框架,旨在简化 Spring 应用的开发过程。

1. 自动配置

Spring Boot 提供了自动配置(Auto Configuration)功能,基于项目的依赖和配置来自动配置 Spring 应用。主要通过 @EnableAutoConfigurationMETA-INF/spring.factories 文件实现。

原理

  • Spring Boot 在启动时会扫描 META-INF/spring.factories 文件中定义的 @Configuration 类。
  • 根据条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean),判断是否需要加载这些配置类。
2. 嵌入式服务器

Spring Boot 提供了嵌入式服务器(如 Tomcat、Jetty),可以直接打包为独立的可执行 JAR 文件,并通过 java -jar 命令启动,简化了部署流程。

3. 约定优于配置

Spring Boot 提供了一系列默认配置,可以减少大量的自定义配置。如果需要,可以通过 application.propertiesapplication.yml 文件自定义配置。

4. Starter POMs

Spring Boot 提供了一系列 Starter POMs,简化了依赖管理。常用的 Starter 包括 spring-boot-starter-webspring-boot-starter-data-jpa 等。

Spring Boot 运行原理

  1. 主类和 @SpringBootApplication 注解

    • 启用自动配置、组件扫描和 Spring Boot 应用的基本配置。
    • @SpringBootApplication 是一个组合注解,包含 @SpringBootConfiguration@EnableAutoConfiguration 和 @ComponentScan
  2. SpringApplication 类

    • SpringApplication.run() 方法启动整个 Spring Boot 应用。
    • 创建 ApplicationContext(默认是 AnnotationConfigServletWebServerApplicationContext),注册所有的 Bean 定义。
  3. 自动配置

    • @EnableAutoConfiguration 启用自动配置机制,根据类路径中的依赖和自定义配置来自动配置 Spring 应用。
    • Spring Boot 在启动时会扫描 META-INF/spring.factories 文件,并加载对应的自动配置类。
  4. 内嵌服务器

    • 默认情况下,Spring Boot 使用内嵌的 Tomcat 服务器,可以通过依赖管理更换为 Jetty 或 Undertow。
    • Spring Boot 会自动部署应用到内嵌服务器,并启动 HTTP 服务。
  5. 运行和热部署

    • Spring Boot 支持热部署,可以在不重启应用的情况下加载新的代码变化。常用的热部署工具包括 Spring Boot DevTools 和 JRebel。

总结

Spring 框架通过 IoC 和 AOP 提供了灵活的依赖管理和面向切面的编程模型。Spring Boot 在此基础上,通过自动配置、嵌入式服务器、约定优于配置和 Starter POMs 大幅简化了 Spring 应用的开发和部署流程。这些框架的共同作用,使得开发者能够更加高效地构建现代化的企业级应用。

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

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

相关文章

代码随想录训练营Day31

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、分发饼干二、摆动序列三、最大子树组合 前言 今天是跟着代码随想录刷题的第31天,主要学习了分发饼干,摆动序列和最大子树组合这三个…

号外!号外!全网第一手Android P刘海屏适配大揭秘,唯一Kotlin算法

如下图所示: 4.2.适配刘海屏 在刘海屏调试打开之后,浏览应用的所有页面,测试所有遮挡问题,或者是下移导致的问题,对有问题的页面进行布局适配。适配方案如下: Google 提供的适配方案,可以设置…

使用VisualBox+Vagrant搭建Centos虚拟机环境

1.下载并安装VisualBox; 2.下载并安装Vagrant; 3.打开cmd窗口,执行命令vagrant init centos/7,初始化centos环境,该步骤受网络带宽影响,可能挂级30分钟到1个小时; 4.启动虚拟机:vagrant up&…

数据库理论大题与编译原理大题(笔记)

目录 数据库(求最小函数依赖) 数据库(求属性集的闭包和候选码) 编译原理(NFA ——> DFA) 编译原理(识别文法的活前缀 DFA 和 LR(0) 分析表) 哈哈!这是本人作者才…

WordPress强大多功能主题模板The7 v9.16.0

模板介绍 The7可以与WPBakery Page Builder(原Visual Composer)和Ultimate Addons的完全无缝集成。它也与大多数流行的插件完全兼容,例如WooCommerce,WPML,Yoast SEO,All in One WP Migration,…

工具方法 - 教育儿童的一些基本原则

全面而有效的教育需要综合多方面的因素和方法。以下是一些关键的教育原则: 1. 爱与关怀:让孩子感受到无条件的爱和关怀,建立安全感和信任感。这是教育的基础。 2. 榜样作用:父母和教师要以身作则,通过自己的行为和态度…

Windows系统下安装RabbitMQ详细步骤

声明:原文参考链接出自: 如何在Windows系统下安装RabbitMQ_rabbitmq windows安装-CSDN博客 https://zhuanlan.zhihu.com/p/693160757 一、RabbitMQ安装软件资源准备 因为RabbitMQ是Erlang语言开发的,因此安装Erlang环境在进行安装RbbitMQ的…

无需破解,打开就是旗舰版!

在当今快节奏的工作环境里,有效的视觉沟通变得至关重要。流程图、思维导图、组织结构图等图表能够帮助我们以清晰、直观的方式传达复杂信息。而Wondershare Edraw Max正是这样一款强大的绘图工具,它能够帮助用户轻松创建各种专业图表。 软件链接&#x…

基于springboot websocket和okhttp实现消息中转

1、业务介绍 消息源服务的消息不能直接推给用户侧,用户与中间服务建立websocket连接,中间服务再与源服务建立websocket连接,源服务的消息推给中间服务,中间服务再将消息推送给用户。流程如下图: 此例中我们定义中间服…

Java中如何优化数据库查询性能?

Java中如何优化数据库查询性能? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java中如何优化数据库查询性能,这是…

ArcgisEngine 释放内存案例

一、案例事由 写了一个循环代码,里面有一句获取相交后的图形 IGeometry tempFeature topoOPer.Intersect(psoureGeo, esriGeometryDimension.esriGeometry2Dimension); 当程序运行到2700左右的时候,就不断报错,显示是内存错误,…

解析PDF文件中的图片为文本

解析PDF文件中的图片为文本 1 介绍 解析PDF文件中的图片,由两种思路,一种是自己读取PDF文件中的图片,然后用OCR解析,例如:使用PyMuPDF读取pdf文件,再用PaddleOCR或者Tesseract-OCR识别文字。另一种使用第…

信息学奥赛初赛天天练-32-CSP-J2022基础题-中缀表达式、后缀表达式、哈夫曼编码、连通图、邻居矩阵、完全二叉树、数组存储

PDF文档公众号回复关键字:20240623 2022 CSP-J 选择题 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 6.对表达式a(b-c)*d的前缀表达式为( ),其中 、- 、 * 是运算符。 A. * a - bcd B. a * - …

【从0实现React18】 (四) 如何触发更新 带你了解react触发更新的流程以及更新后如何触发render

常见的触发更新的方式 创建 React 应用的根对象 ReactDOM.creatRoot().render();类组件 this.setState();函数组件 useState useEffect; 我们希望实现一套统一的更新机制,他的特点是: 兼容上述触发更新的方式方便后续…

linux 压缩解压操作

前言 ​ 汇总简介linux系统中常见各种文件压缩格式,包括tarball, zip, bz2, 7z, xz, rar等等的压缩和解压缩。本文中只介绍所涉及到的工具或命令常见使用方法,更详细更高端的使用方法可以用"cmd --help"的方式进行查看。 1.tarball压缩与解压…

c++学习-----内存管理

1. C/C内存分布 我们先来看下面的一段代码和相关问题 答案揭晓: 这里很多人会误认为*char2在常量区,这其实是错误的 因为: 首先在内存字符常量区分配一块内存空间放下”abcd\0”,然后在栈中分配一块连续的内存空间,…

SQL-Python

师从黑马程序员 数据库介绍 数据库就是存储数据的库 数据组织:库->表->数据 数据库和SQL的关系 MySQL的基础命令 SQL基础 SQL语言的分类 SQL的语法特征 DDL-库管理 show DATABASES;use sys;SELECT database();CREATE DATABASE test CHARSET utf-8;SHOW D…

学习C++第二天

1.缺省参数 缺省参数的概念&#xff1a; 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void show(int a 10) {cout << a << endl; }int main() {sho…

ubuntu18.04 编译HBA 并实例运行

HBA是一个激光点云层级式的全局优化的程序&#xff0c;他的论文题目是&#xff1a;HBA: A Globally Consistent and Efficient Large-Scale LiDAR Mapping Module&#xff0c;对应的github地址是&#xff1a;HKU-Mars-Lab GitHub 学习本博客&#xff0c;可以学到gtsam安装&am…

提升Python技能的七个函数式编程技巧

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 递归📝 结构化模式匹配📝 不变性📝 纯函数📝 高阶函数📝 函数组合📝 惰性求值⚓️ 相关链接 ⚓️📖 介绍 📖 在现代编程中,虽然Python并不是一门纯粹的函数式编程语言,但函数式编程(Funct…