当前位置: 首页 > news >正文

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 应用的开发和部署流程。这些框架的共同作用,使得开发者能够更加高效地构建现代化的企业级应用。

相关文章:

  • Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn
  • 四川汇聚荣科技有限公司怎么样?
  • ansibie yum模块
  • 项目3:从0开始的RPC框架(扩展版)-2
  • 【地质灾害监测实现有效预警,44人提前安全转移】
  • linux关于epoll概述(各项组成,以及作用)
  • 前后端分离后灰度发布实现方式
  • iOS Facebook SDK 安装
  • 针对ARM64嵌入式系统的Linux内核参数优化
  • vlan三层交换技术--交换机--(自作)
  • 测试测量-DMM直流精度
  • 我的常见问题记录
  • 学习C++第二天
  • Springboot微服务整合缓存的时候报循环依赖的错误 两种解决方案
  • 深入理解go语言反射机制
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • chrome扩展demo1-小时钟
  • Java基本数据类型之Number
  • JS变量作用域
  • PV统计优化设计
  • 安装python包到指定虚拟环境
  • 动态规划入门(以爬楼梯为例)
  • 分布式任务队列Celery
  • 机器学习 vs. 深度学习
  • 基于axios的vue插件,让http请求更简单
  • 简单数学运算程序(不定期更新)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端面试之闭包
  • 什么是Javascript函数节流?
  • 算法-插入排序
  • 我建了一个叫Hello World的项目
  •  一套莫尔斯电报听写、翻译系统
  • 移动端 h5开发相关内容总结(三)
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​业务双活的数据切换思路设计(下)
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (含笔试题)深度解析数据在内存中的存储
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三)uboot源码分析
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • *p++,*(p++),*++p,(*p)++区别?
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net FrameWork总结
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET Project Open Day(2011.11.13)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 直连SAP HANA数据库
  • .NET中分布式服务
  • /etc/sudoer文件配置简析
  • @FeignClient注解,fallback和fallbackFactory
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • []Telit UC864E 拨号上网