【框架】Spring、SpringBoot和SpringCloud区别

Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)
IoC(Inversion of Control,控制反转)是一种设计思想,它主要用于降低软件系统中不同模块之间的耦合度,提高代码的可维护性和可扩展性。
一、传统开发与 IoC 开发的对比
在传统的软件设计中,对象的创建和依赖关系的管理通常由对象自身负责。例如,一个对象 A 需要依赖对象 B 来完成某些功能,那么对象 A 就会在自己的代码中显式地创建对象 B。这样的方式会导致对象之间的耦合度较高,当对象 B 的实现发生变化时,可能需要修改对象 A 的代码。
而在 IoC 的设计模式下,对象的创建和依赖关系的注入由一个外部的容器(通常称为 IoC 容器)来负责。对象只需要声明自己所需要的依赖,而不需要关心这些依赖是如何创建和管理的。当对象需要使用依赖时,IoC 容器会自动将依赖注入到对象中。
二、IoC 的实现方式

  • 依赖注入(Dependency Injection,DI)
    这是实现 IoC 的主要方式之一。依赖注入是指在对象创建的时候,由 IoC 容器将对象所需要的依赖传递给它。依赖注入可以通过构造函数注入、Setter 方法注入和接口注入等方式实现。
  • 构造函数注入:在对象创建时,通过构造函数将依赖传递给对象。这种方式可以确保对象在创建时就拥有所需的依赖,并且可以保证依赖的不可变性。
  • Setter 方法注入:在对象创建后,通过 Setter 方法将依赖传递给对象。这种方式比较灵活,可以在对象创建后动态地设置依赖。

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,它通过在不修改原有业务逻辑代码的情况下,对业务逻辑的各个部分进行增强或补充,从而实现横切关注点的分离。
一、AOP 的核心概念

  • 切面(Aspect)
    切面是对横切关注点的模块化封装,它包含了对业务逻辑的增强或补充的代码。例如,日志记录、事务管理、安全检查等都可以作为切面。
  • 连接点(Join Point)
    连接点是程序执行过程中的一个特定点,例如方法调用、方法执行、异常抛出等。在 AOP 中,连接点是切面可以插入的地方。
  • 切入点(Pointcut)
    切入点是对连接点的筛选条件,它定义了哪些连接点可以被切面增强。通过定义切入点,可以精确地控制切面的作用范围。
  • 通知(Advice)
    通知是在切入点处执行的代码,它可以在连接点之前、之后或周围执行。通知分为前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)等类型。

SpringBoot

SpringBoot是为了简化Spring开发的框架(具体体现就是说Spring创建一个代码需要配置对应的Bean和MVC(xml文件)但是SpringBoot无需配置)主要的一个特点就是约定大于配置(就我们上面说的Spring需要配置一些信息,但是SpringBoot就不需要)

  • 自动配置
    • Spring Boot 在启动时会自动扫描类路径下的依赖和配置,并根据这些信息进行自动配置。
    • 自动配置的原理:自动配置主要是归功于@SpringBootApplication这个注解,由@SpringBootConfiguration
      @EnableAutoConfiguration
      @ComponentScan
      这三个注解组成的,其中 @EnableAutoConfiguration 是实现自动化配置的核心注解。该注解主要是通过 @Import 注解导入对应的配置选择器。关键是内部读取该项目和 该项目引入的Jar包 里的classpath路径下的** META-INF/spring.factories **文件中的所配置类的全类名。这些配置类中所定义的Bean还会根据对应的条件注解 @CoditionalOnClass 这个注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。
  • 约定大于配置
    • SpringBoot是为了简化Spring开发的框架(具体体现就是说Spring创建一个代码需要配置对应的Bean和MVC(xml文件)但是SpringBoot无需配置)主要的一个特点就是约定大于配置(就我们上面说的Spring需要配置一些信息,但是SpringBoot就不需要)
      代码示例:
      SpringBoot实现
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@GetMapping("/hello")public String hello() {return "Hello, Spring Boot!";}
}

Spring代码实现:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HelloWorldController {@RequestMapping("/hello")@ResponseBodypublic String hello() {return "Hello, Spring!";}public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");}
}

同时,你需要创建一个名为 applicationContext.xml 的配置文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="你的包名"/><mvc:annotation-driven/>
</beans>

SpringCloud

Spring Cloud 是一个基于 Spring Boot 的微服务开发框架,它提供了一系列工具和组件,帮助开发人员快速构建分布式系统。

一、主要特点

  1. 服务治理

    • Spring Cloud 提供了服务注册与发现机制,如 Eureka、Consul 等。服务提供者可以将自己注册到服务注册中心,服务消费者可以从注册中心获取服务提供者的地址信息,从而实现服务的动态发现和调用。
    • 例如,在一个微服务架构中,有多个服务实例同时运行。当一个服务实例出现故障时,服务注册中心可以及时感知到,并将该实例从可用服务列表中移除,避免服务消费者调用到故障实例。
  2. 负载均衡

    • Spring Cloud 集成了 Ribbon 等负载均衡组件,可以实现服务消费者对服务提供者的负载均衡调用。负载均衡可以提高系统的可用性和性能,避免单个服务实例过载。
    • 例如,当有多个服务提供者实例时,Ribbon 可以根据一定的策略(如轮询、随机等)将请求分发到不同的实例上,实现负载均衡。
  3. 断路器

    • Spring Cloud 引入了 Hystrix 等断路器组件,用于防止服务故障的连锁反应。当某个服务出现故障时,断路器可以快速切断对该服务的调用,避免故障扩散,同时可以提供降级策略,返回备用的响应结果。
    • 例如,在一个电商系统中,如果订单服务出现故障,断路器可以切断对订单服务的调用,并返回一个提示信息,如“系统繁忙,请稍后再试”,而不是让故障扩散到整个系统。
  4. 配置管理

    • Spring Cloud Config 提供了集中式的配置管理服务,可以实现对微服务应用的配置集中管理和动态更新。配置信息可以存储在 Git 仓库等外部存储中,方便进行版本控制和管理。
    • 例如,当需要修改某个微服务的配置参数时,只需要在配置中心进行修改,然后通知微服务应用进行配置更新,而不需要逐个修改每个微服务的配置文件。
  5. 网关

    • Spring Cloud Gateway 是一个基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 网关。它可以实现请求的路由、过滤、限流等功能,为微服务架构提供统一的入口和出口。
    • 例如,网关可以根据请求的 URL 将请求路由到不同的微服务上,同时可以对请求进行安全验证、日志记录、限流等操作,提高系统的安全性和性能。

二、应用场景

  1. 微服务架构

    • Spring Cloud 非常适合用于构建微服务架构的应用系统。它可以帮助开发人员快速搭建微服务架构的各个组件,如服务注册与发现、负载均衡、断路器、配置管理等,提高开发效率和系统的可维护性。
    • 例如,在一个大型的电商系统中,可以将订单服务、商品服务、用户服务等拆分成多个微服务,每个微服务都可以独立部署和扩展,通过 Spring Cloud 实现服务之间的通信和协作。
  2. 分布式系统

    • Spring Cloud 提供了一系列工具和组件,用于构建分布式系统。它可以帮助开发人员解决分布式系统中的各种问题,如服务治理、负载均衡、故障处理、配置管理等,提高系统的可用性和性能。
    • 例如,在一个分布式的日志分析系统中,可以使用 Spring Cloud 实现日志采集服务、日志存储服务、日志分析服务等多个微服务之间的通信和协作,提高系统的可扩展性和可维护性。
  3. 云原生应用

    • Spring Cloud 与云原生技术(如容器化、DevOps、持续交付等)紧密结合,可以帮助开发人员快速构建云原生应用。它可以在容器化环境中运行,支持自动化部署和扩缩容,提高应用的弹性和可扩展性。
    • 例如,在一个基于 Kubernetes 的云原生应用中,可以使用 Spring Cloud 实现服务注册与发现、负载均衡、断路器等功能,同时可以利用 Kubernetes 的自动化部署和扩缩容功能,提高应用的可用性和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

排序----快速排序(快排)(递归版)

首先讲一下单趟的思路&#xff1a; 在这一块数据中&#xff0c;记录第一个元素为key&#xff0c;然后设置L和R两个指针&#xff0c;L找比key处的元素大的&#xff0c;R找比key处元素小的&#xff0c;找到了就交换这两个位置的元素。当两个指针相遇时&#xff0c;若相遇点的元素…

20240921在友善之臂的NanoPC-T6开发板上确认宸芯的数传模块CX6602N的AT命令

console:/dev # cat ttyUSB1 & console:/dev # echo AT > ttyUSB1 20240921在友善之臂的NanoPC-T6开发板上确认宸芯的数传模块CX6602N的AT命令 2024/9/21 21:03 【必须】Android12/Linux&#xff08;Buildroot&#xff09;都必须要&#xff01; 4、【Android12默认打开U…

https的连接过程

根证书: 内置在操作系统和浏览器中,可手动添加,下级是中间证书或服务器证书,只有当中间证书或服务器证书关联到已存在的根证书时,中间证书或服务器证书才视为有效 中间证书: 位于根证书和服务器证书之间,他们之间也可以没有中间证书,作用是对根证书增加一个下级,方便管理,由根…

GAMES101(作业4~5)

作业四 题目&#xff1a; 由 4 个控制点表示的 Bzier 曲线&#xff0c; bezier&#xff1a;该函数实现绘制 Bzier 曲线的功能。它使用一个控制点序列和一个 OpenCV&#xff1a;&#xff1a;Mat 对象作为输入&#xff0c;没有返回值。它会使 t 在 0 到 1 的范围内进 行迭代&a…

【Linux】进程地址空间和进程调度队列

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

RecyclerView的notifyDataSetChanged和notifyItemRemoved之间的区别

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 RecyclerView 提供了多种方法来通知适配器&#xff08;Adapter&#xff09;数据集发生变化&#xff0c;其中 notifyDataSetChanged() 和 notify…

数据库系统基础概述

文章目录 前言一、数据库基础概念 1.数据库系统的组成2.数据模型3.数据库的体系结构二、MySQL数据库 1.了解MySQL2.MySQL的特性3.MySQL的应用场景总结 前言 MySQL数据库是一款完全免费的产品&#xff0c;用户可以直接从网上下载使用&#xff0c;不用花费任何费用。这点对于初学…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

【AcWing】875. 快速幂

#include<iostream> using namespace std; typedef long long LL;LL qmi(int a,int b,int p){LL res1%p;//%p是为了p1的时候&#xff0c;余数是0while(b){if(b&1) resres*a%p;//位数是1的b>>1;aa*(LL)a%p;//a*a再modp是为了防止溢出}return res; }int main(){i…

【动态规划】(三)动态规划——完全背包

动态规划——完全背包 完全背包理论基础零钱兑换Ⅱ组合总和Ⅳ爬楼梯&#xff08;进阶版&#xff09;零钱兑换完全平方数单词拆分背包问题总结 完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

零食店小程序发展客户转化运营

零食店、折扣店近些年市场中跑出了不少区域性、多地化的品牌&#xff0c;直营及加盟模式&#xff0c;还有各种超市、商场、街边小店等&#xff0c;零食基本没有年龄群体限制&#xff0c;又属于常消费品&#xff0c;线上线下生意都可以进行发展。 线下客户到店&#xff0c;线上…

链表数据结构

链表可以解决顺序表的缺点 我们今天简单引用下链表 这边是代码讲解 头文件 #pragma once #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> using namespace std; typedef struct student {union {int data;int len;};s…

【计网】从零开始掌握序列化与反序列化 --- 基础知识储备与程序重构

从零开始掌握序列化与反序列化 1 初识序列化与反序列化2 再谈Tcp协议3 程序重构3.1 Socket类3.2 回调函数设计3.3 最终的Tcp服务器类 1 初识序列化与反序列化 在刚学习计算机网络时&#xff0c;我们谈到过网络协议栈&#xff0c;其中最上层的就是应用层&#xff0c;那么这个应…

Rosetta 一:手把手教你用Linux安装Rosetta(全网最简洁)

文章目录 1. Rosetta 介绍2.下载2. Rosetta 安装3. 验证安装 1. Rosetta 介绍 很久很久之前就对Rosetta有所耳闻&#xff0c;有一篇文章叫做denovo protein design&#xff0c;说的就是用rosetta来设计蛋白质。 rosetta是david baker团队设计的软件&#xff0c;早期只是一个蛋…

【Godot4.3】胶囊形的偏移获取法

概述 之前用半圆弧拼接的方式求过胶囊形&#xff0c;在逐渐熟练使用Geometry2D的过程中&#xff0c;发现通过线段求端点是圆角类型的偏移多边形&#xff0c;获得的就是胶囊形。 所以我们有了第二种胶囊形求法。 测试代码 tool extends Node2D## 横向宽度 export var width:…

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

SQL server学习01-SQL server环境配置

目录 一&#xff0c;手动下载及安装 microsoft .net framework 3.5 1&#xff0c;下载 2&#xff0c;安装 二&#xff0c;安装SQL server2014 1&#xff0c;下载 2&#xff0c;安装 3&#xff0c;启动SQL server服务 三&#xff0c;下载及安装Microsoft SQL Server…

C Prime Plus 第6章习题

你该逆袭了 红色标注的是&#xff1a;错误的答案 蓝色标注的是&#xff1a;正确的答案 绿色标注的是&#xff1a;做题时有疑问的地方 橙色标注的是&#xff1a;答案中需要着重注意的地方 练习题 一、复习题1、2、3、4、5、我的答案&#xff1a;错误正确答案&#xff1a; 6、7、…

ubuntu 安装minikube,并拉取k8s镜像

不要使用最新版&#xff0c;重要的事情说三遍&#xff0c;刚开始也是最求新一点的版本&#xff0c;但问题很多&#xff0c;主要是版本之间的依赖问题&#xff0c;不是某个依赖的版本不支持某些功能&#xff0c;就是依赖之间的版本不能对应上&#xff0c;所以就降低几个版本&…

行业人工智能研究-Python自监督方式学习图像表示算法

学术界人工智能研究落后于工业界 摘要 行业或工业界在人工智能研究上超出学术界&#xff0c;并占据着大量的计算力&#xff0c;数据集和人才诱人的薪水和明朗的预期吸引大量人才离开学术界&#xff0c;涌入行业或工业界即使&#xff0c;比如Meta开源其人工智能模型&#xff0…