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

Spring 框架入门介绍及IoC的三种注入方式

目录

一、Spring 简介

1. 简介

2. spring 的核心模块 ⭐

 

 二、IoC 的概念

2.1 IoC 详解

2.2 IoC的好处

2.3 谈谈你对IoC的理解

 

三、IoC的三种注入方式

3.1 构造方法注入

3.2 setter方法注入

3.3 接口注入(自动分配)

3.4 spring上下文与tomcat整合

3.5 总结


一、Spring 简介

1. 简介

        Spring框架是 Java 平台的一个开源的全栈(full-stack)应用程序框架和控制反转容器实现,一般被直接称为 Spring。它由Rod Johnson创建,去搜索了它的资料很难想象Rod Johnson之前是学音乐。该框架的一些核心功能理论上可用于任何 Java 应用,它还为基于Java企业版平台构建的 Web 应用提供了大量的拓展支持。Spring 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了 企业级JavaBeans(EJB)模型。

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

目的:解决企业应用开发的复杂性

功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

范围:任何Java应用

2. spring 的核心模块 ⭐

  1. 控制反转(IoC):Spring通过IoC容器管理应用程序中的对象依赖关系。它将对象的创建、组装和管理工作交给了容器,开发人员只需要关注业务逻辑的实现。

  2. 面向切面编程(AOP):Spring支持AOP,可以将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的模块化和可重用性。

  3. 数据访问支持:Spring提供了对各种数据访问技术的支持,包括JDBC、ORM(如Hibernate、MyBatis)、JPA等。它简化了数据访问层的开发,提供了事务管理和异常处理等功能。

  4. Web开发支持:Spring提供了一套全面的Web开发框架,包括Spring MVC和Spring WebFlux。它们可以帮助开发人员构建灵活、高效的Web应用程序。

  5. 安全性支持:Spring提供了一套强大的安全性框架,可以用于认证、授权和安全性管理。它支持各种认证方式,如基于表单、基于HTTP基本认证、基于OAuth等。

        此外,Spring还提供了许多其他功能和扩展,如缓存支持、消息队列、调度任务等。它的模块化设计使得开发人员可以根据需要选择使用的功能,从而提高开发效率。

 二、IoC 的概念

2.1 IoC 详解

  • Spring框架中的IoC(Inversion of Control,控制反转)是指将对象的创建、依赖关系的管理和对象的生命周期等控制权从应用程序代码中转移到框架中。在IoC的概念下,对象的创建和管理不再由开发人员直接控制,而是由Spring容器来负责。
  • IoC的核心思想是通过依赖注入(Dependency Injection,DI)来实现对象之间的解耦。依赖注入是指在对象创建的过程中,将其所依赖的其他对象的引用注入到对象中,从而实现对象之间的关系建立和协作。通过依赖注入,对象不再负责自己依赖对象的创建和查找,而是由容器来完成。
  • Spring框架中的IoC容器负责管理对象的生命周期和依赖关系。它通过配置文件(如XML配置文件)或注解的方式描述对象之间的依赖关系,并在应用程序启动时将这些对象实例化并组装起来。开发人员只需要定义对象的行为,而无需关心对象的创建和管理过程。

2.2 IoC的好处

  1. 解耦:通过依赖注入,对象之间的依赖关系被明确地声明在配置文件或注解中,使得对象之间的耦合度降低,提高了代码的可维护性和可测试性。

  2. 简化对象的创建和管理:由容器负责对象的创建和生命周期管理,开发人员只需关注对象的行为逻辑,而无需手动管理对象的创建和销毁。

  3. 提供灵活的配置方式:通过配置文件或注解,可以方便地修改对象之间的依赖关系,实现灵活的配置和组装。

  4. 支持AOP(Aspect-Oriented Programming):Spring框架提供了面向切面编程的支持,可以通过IoC容器将横切逻辑(如日志、事务管理等)与业务逻辑分离,提高了代码的模块化和可维护性。

2.3 谈谈你对IoC的理解

        Spring框架中的IoC(控制反转)通过依赖注入实现对象之间的解耦,将对象的创建和管理交由容器负责。使用IoC容器可以简化对象的创建和管理过程,提高代码的可维护性和可测试性。通过灵活的配置方式,可以方便地修改对象之间的依赖关系。同时,IoC容器的存在也为AOP提供了支持,使得横切逻辑与业务逻辑分离,提高了代码的模块化和可维护性。

三、IoC的三种注入方式

3.1 构造方法注入

一、构造函数注入(Constructor Injection):通过构造函数来注入依赖对象。在类的构造函数中声明依赖对象的参数,并在容器中配置时提供相应的依赖对象。当创建对象实例时,容器会自动将依赖对象传递给构造函数,完成依赖注入。

示例代码:

1. 编写一个接口定义修改用户信息的方法

package com.ycxw.ioc.service;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:28*/
public interface UserService {/*** 方法功能:修改用户信息*/public void edit();
}

2. 编写一个service类来实现这个接口中的方法

package com.ycxw.ioc.service.impl;import com.ycxw.ioc.service.UserService;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:29**/
public class UserServiceImpl1 implements UserService {@Overridepublic void edit() {System.out.println("更改了用户的信息");}
}

3. 编写控制器(action)进行调用并编写无参和有参构造方法

package com.ycxw.ioc.web;import com.ycxw.ioc.service.UserService;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:30**/
public class UserAction {private UserService userService;public UserAction() {}public UserAction(UserService userService) {this.userService = userService;}public String edits(){userService.edit();return "list";}
}

🌟4. 编写spring.xml配置文件,用于定义和配置Spring应用程序的组件、依赖关系、行为和其他相关配置。它是Spring框架的核心配置文件之一。

  1. 定义Bean:在spring.xml文件中,可以使用XML配置元素来定义应用程序中的Bean对象。通过配置Bean的类路径、构造函数,Spring容器可以根据配置文件中的定义来创建和管理Bean对象。

  2. 配置依赖注入:spring.xml文件可以指定Bean之间的依赖关系,通过配置构造函数注入,将依赖的Bean (userService) 注入到目标Bean (userAction) 中,实现依赖注入。这样可以实现对象之间的解耦,提高代码的灵活性和可测试性。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.ycxw.ioc.web.UserAction" id="userAction"><constructor-arg name="userService" ref="userService"></constructor-arg></bean><bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

5. 测试

package com.ycxw.ioc.test;import com.ycxw.ioc.web.UserAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 22:35*/
public class demo1 {public static void main(String[] args) {//加载spring核心配置文件(建模,这个spring的上下文对象),上下文对象中可以获取任何javabean对象ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");//(强转)应用指定对象UserAction userAction = (UserAction) context.getBean("userAction");//调用修改用户信息方法userAction.edits();}
}

3.2 setter方法注入

二、Setter方法注入(Setter Injection):通过setter方法来注入依赖对象。在类中定义相应的setter方法,并在容器中配置时使用相应的属性或标签指定依赖对象。当创建对象实例后,容器会调用相应的setter方法,将依赖对象注入到对象中。

示例代码:

1. 修改了控制器(action)

package com.ycxw.ioc.web;import com.ycxw.ioc.service.UserService;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-14 18:40**/
public class UserAction {private UserService userService;public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}public String edits(){userService.edit();return "list";}
}

2. 修改了bean注入的方式 (property)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.ycxw.ioc.web.UserAction" id="userAction"><property name="userService" ref="userService"></property><bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

 

3.3 接口注入(自动分配)

三、这里请注意byType 和 byName 的区别:

1. byType(按类型自动装配):

  • byType模式下,Spring容器会根据属性的类型来查找与之匹配的Bean,并将其自动注入到对应的属性上。
  • 例如,如果一个属性的类型为userService,Spring容器会查找实现了userService接口的Bean,并将其注入到该属性上。
  • 要使用byType模式,目标Bean的属性类型必须与其他Bean的类型匹配,并且在容器中只能有一个匹配的Bean。

2. byName(按名称自动装配):

  • byName模式下,Spring容器会根据属性的名称来查找与之匹配的Bean,并将其自动注入到对应的属性上。
  • 例如,如果一个属性名为myBean,Spring容器会查找名称为myBean的Bean,并将其注入到该属性上。
  • 要使用byName模式,目标Bean的属性名称必须与其他Bean的名称匹配。

 

3.4 spring上下文与tomcat整合

        在用户每一次发送任意请求,在对应请求处理代码中可以获取到spring容器中配置的任意的JavaBean,从而获取对应的javabean中定义的方法。

实现思路:

  1. 在tomcat启动的时候自动去加载spring的上下文(ApplicationContext)
  2. 利用监听器去把spring的上下文放到tomcat的上下文中
  3. 为了解决框架的配置文件冲突的问题,我们需要动态指定spring上下文的配置文件名称

 

示例代码:

1. 编写SpringLoadListener 监听器

package com.ycxw.ioc.listener;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 10:25*/
@WebListener
public class SpringLoadListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {//加载spring核心配置文件(建模,这个spring的上下文对象),上下文对象中可以获取任何javabean对象ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");//获取tomcat上下文ServletContext servletContext = sce.getServletContext();//把srping的上下文放入tomcat中servletContext.setAttribute("springContext",context);}
}

2. 编写servlet测试

package com.ycxw.ioc.web;import com.ycxw.ioc.service.UserService;
import org.springframework.context.ApplicationContext;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-08-16 10:29*/
@WebServlet("/userList")
public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//当处理用户请求的时候,获取spring的上下文对象ApplicationContext springContext = (ApplicationContext ) req.getServletContext().getAttribute("springContext");//拿到userService的BeanUserService userAction = (UserService) springContext.getBean("userService");System.out.println(userAction);userAction.edit();}
}

 

3. 用户处理结果后打印输出

 

3.5 总结

        Spring框架提供了三种主要的依赖注入方式:构造函数注入、Setter方法注入和字段注入。构造函数注入通过构造函数来注入依赖对象,Setter方法注入通过setter方法来注入依赖对象,字段注入通过直接注入字段来实现依赖注入。这些注入方式可以单独使用,也可以结合使用,具体选择可以根据实际需求和个人偏好来决定。

相关文章:

Spring 框架入门介绍及IoC的三种注入方式

目录 一、Spring 简介 1. 简介 2. spring 的核心模块 ⭐ 二、IoC 的概念 2.1 IoC 详解 2.2 IoC的好处 2.3 谈谈你对IoC的理解 三、IoC的三种注入方式 3.1 构造方法注入 3.2 setter方法注入 3.3 接口注入&#xff08;自动分配&#xff09; 3.4 spring上下文与tomcat整…...

Centos升级openssl

依赖包 安装编译 OpenSSL 所需的包&#xff0c;包括 gcc、make、perl 和 zlib-devel。可以通过运行以下命令完成&#xff1a; yum install -y gcc make perl zlib-devel安装包下载 下载 OpenSSL 1.1.1 的源码包&#xff0c;可以从 OpenSSL 官网下载&#xff08;https://www.op…...

第4章:决策树

停止 当前分支样本均为同一类时&#xff0c;变成该类的叶子节点。当前分支类型不同&#xff0c;但是已经没有可以用来分裂的属性时&#xff0c;变成类别样本更多的那个类别的叶子节点。当前分支为空时&#xff0c;变成父节点类别最多的类的叶子节点。 ID3 C4.5 Cart 过拟合 缺…...

小米平板6Max14即将发布:自研G1 电池管理芯片,支持33W反向快充

明天晚上7点&#xff08;8 月 14 日&#xff09;&#xff0c;雷军将进行年度演讲&#xff0c;重点探讨“成长”主题。与此同时&#xff0c;小米将推出一系列全新产品&#xff0c;其中包括备受瞩目的小米MIX Fold 3折叠屏手机和小米平板6 Max 14。近期&#xff0c;小米官方一直在…...

Elasticsearch复合查询之Boosting Query

前言 ES 里面有 5 种复合查询&#xff0c;分别是&#xff1a; Boolean QueryBoosting QueryConstant Score QueryDisjunction Max QueryFunction Score Query Boolean Query在之前已经介绍过了&#xff0c;今天来看一下 Boosting Query 用法&#xff0c;其实也非常简单&…...

Clickhouse基于文件复制写入

背景 目前clickhouse社区对于数据的写入主要基于文件本地表、分布式表方式为主&#xff0c;但缺乏大批量快速写入场景下的数据写入方式&#xff0c;本文提供了一种基于clickhouse local 客户端工具分布式处理hdfs数据表文件&#xff0c;并将clickhouse以文件复制的方式完成写入…...

梅赛德斯-奔驰将成为首家集成ChatGPT的汽车制造商

ChatGPT的受欢迎程度毋庸置疑。OpenAI这个基于人工智能的工具&#xff0c;每天能够吸引无数用户使用&#xff0c;已成为当下很受欢迎的技术热点。因此&#xff0c;有许多公司都在想方设法利用ChatGPT来提高产品吸引力&#xff0c;卖点以及性能。在汽车领域&#xff0c;梅赛德斯…...

QT-播放原始PCM音频流

QT multimedia audioplay.h /************************************************************************* 接口描述&#xff1a;原始音频播放类 拟制&#xff1a; 接口版本&#xff1a;V1.0 时间&#xff1a;20220922 说明&#xff1a; ********************************…...

【杂谈】聊聊我是如何从Java转入Web3的

我先说说我基本的一个情况吧&#xff1a; 我是之前是一位从业了传统web2行业三年的Java开发&#xff0c;在2018年尾才开始去关注区块链的&#xff0c;之前虽然也有混迹在币圈&#xff0c;但是没怎么关注到币圈的内在运行逻辑。 后面因为当时元宇宙和Web3的概念特别火&a…...

ArrayList

目录 1.ArrayList简介 2.ArrayList的构造 2.1ArrayList() 2.2ArrayList(Collection c) 2.3ArrayList(int initialCapacity) 3.ArrayList常见操作 4.ArrayList的遍历的遍历 1.ArrayList简介 在集合框架中&#xff0c; ArrayList 是一个普通的类&#xff0c;实现了 List…...

不重启Docker能添加自签SSL证书镜像仓库吗?

应用背景 在企业应用Docker规划初期配置非安全镜像仓库时&#xff0c;有时会遗漏一些仓库没配置&#xff0c;但此时应用程序已经在Docker平台上部署起来了&#xff0c;体量越大就越不会让人去直接重启Docker。 那么&#xff0c;不重启Docker能添加自签SSL证书镜像仓库吗&…...

Ajax介绍

1.与服务器进行数据交换&#xff1a;通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 2.异步交互&#xff1a;可以在 不重新加载整个页面 的情况下&#xff0c;与服务器交换数据并 更新部分网页 的技术&#xff0c;如&#xff1a; 搜索联想、用户名是否可…...

docker 学习--02 常用命令

docker 学习–02 常用命令 docker 学习-- 01 基础知识 docker 学习-- 03 环境安装&#xff08;win10&#xff09; 文章目录 docker 学习--02 常用命令1. 帮助启动类命令1.1启动docker1.2 停止docker1.3 重启docker1.4 查看docker1.5 设置开机自启1.6 查看docker概要信息1.7 查…...

socks5 保障网络安全与爬虫需求的完美融合

Socks5代理&#xff1a;跨足网络安全和爬虫领域的全能选手 Socks5代理作为一种通用的网络协议&#xff0c;为多种应用场景提供了强大的代理能力。它不仅支持TCP和UDP的数据传输&#xff0c;还具备更高级的安全特性&#xff0c;如用户身份验证和加密通信。在网络安全中&#xf…...

构建智能医疗未来:人工智能在线上问诊系统开发中的应用

随着人工智能技术的飞速发展&#xff0c;医疗领域也正在逐步迎来一场革命性的变革。其中&#xff0c;人工智能在在线上问诊系统开发中的应用&#xff0c;正为医疗产业带来全新的可能性。本文将深入探讨如何利用代码构建智能医疗未来&#xff0c;以提升线上问诊系统的效率、准确…...

css3-grid:grid 布局 / 基础使用

一、理解 grid 二、理解 css grid 布局 CSS Grid布局是一个二维的布局系统&#xff0c;它允许我们通过定义网格和网格中每个元素的位置和尺寸来进行页面布局。CSS Grid是一个非常强大的布局系统&#xff0c;它不仅可以用于构建网格布局&#xff0c;还可以用于定位元素&#xf…...

如何在windows电脑安装多个tomcat服务器和乱码问题

前提条件安装jdk 以17版本为例&#xff0c;将jdk8卸载干净 1.首先进入tomcat官网下载 tomcat网址 这里下载tomcat10为例子 1.1 这里选择方式一 下载解压版 2.解压后拷贝三份 分别命名为 8081、 8082、 8083 3.分别对每个tomcat执行以下操作 3.1 找到tomcat所在webapps文…...

flutter:webview_flutter的简单使用

前言 最近在研究如何在应用程序中嵌入Web视图&#xff0c;发现有两个库不错。 一个是官方维护、一个是第三方维护。因为没说特别的需求&#xff0c;就使用了官方库&#xff0c;实现一些简单功能是完全ok的 基本使用 官方文档 https://pub-web.flutter-io.cn/packages/webv…...

Ansys Zemax | 手机镜头设计 - 第 1 部分:光学设计

本文是 3 篇系列文章的一部分&#xff0c;该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念、设计到制造和结构变形的分析。本文是三部分系列的第一部分&#xff0c;将专注于OpticStudio中镜头模组的设计、分析和可制造性评估。&#xff08;联系我们获取文章附件…...

jvm从入门到精通

jvm 1.jvm与java体系结构​​​​​​​...

3步解锁Windows隐藏音质:免费工具让普通音箱变HIFI

3步解锁Windows隐藏音质&#xff1a;免费工具让普通音箱变HIFI 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 你是不是总觉得电脑声音"干巴巴"的&#xff1f;看大片缺乏震撼感&#xff0c;听…...

Multi-Agent 系统故障排查:常见问题与解决方案速查手册

Multi-Agent系统故障排查实战手册:从踩坑到精通的全场景解决方案 关键词 多智能体系统、故障排查、分布式系统、Agent通信故障、共识算法、容错机制、可观测性 摘要 随着大模型技术的爆发,Multi-Agent(多智能体)系统已经成为AI应用、工业互联网、分布式机器人、智能客服…...

避开蓝桥杯LED控制常见坑:STC15单片机P0口上拉、锁存器时序与宏定义的正确写法

避开蓝桥杯LED控制三大雷区&#xff1a;STC15单片机实战精要 第一次参加蓝桥杯嵌入式组的同学&#xff0c;往往会在LED控制这个看似简单的环节栽跟头。明明仿真软件里运行正常的代码&#xff0c;烧录到开发板上却出现LED亮度不足、闪烁异常甚至完全不亮的情况。这背后隐藏着STC…...

告别折腾:用 apt 和 Qt 官方安装器两种方式在 Debian 上搞定 Qt 5.15.2 开发环境

在 Debian 上搭建 Qt 5.15.2 开发环境的双轨方案 对于需要在 Debian 系统上建立 Qt 开发环境的工程师来说&#xff0c;选择正确的安装方式往往比安装本身更重要。本文将深入探讨两种主流方案&#xff1a;Debian 官方仓库的 apt 安装和 Qt 官方在线安装器&#xff0c;帮助您根据…...

REX-C410温控仪连接K型热电偶相关参数设置

1、同时按SET<键3秒 并按SET切换 修改后按 SET键3秒 保存 改SL1 参数为000 K型热电偶 改SL4 参数为0011 过程上限报警 2、按 SET键3秒 改AL1 为SV设定温度值这样修改后当实际温度 小于SV 设定温度值时OUT有输出&#xff0c;当温度达到设定值时ALM1有输出...

不止是‘小电脑’:用树莓派4B+Python+传感器,手把手打造你的第一个智能家居原型

从零构建智能家居中枢&#xff1a;树莓派4B实战指南 当一块信用卡大小的电路板能够控制你家的灯光、监测室内环境并自动调节空调时&#xff0c;传统家电的边界就被彻底打破了。树莓派4B以其不到400元的售价和完整的计算机架构&#xff0c;正在重新定义智能家居的入门门槛。本文…...

如何免费使用AI图像放大神器Upscayl?一文掌握所有技巧

如何免费使用AI图像放大神器Upscayl&#xff1f;一文掌握所有技巧 【免费下载链接】upscayl &#x1f199; Upscayl - #1 Free and Open Source AI Image Upscaler for Linux, MacOS and Windows. 项目地址: https://gitcode.com/GitHub_Trending/up/upscayl 想要将模糊…...

手把手教你搭建低成本雷达测试环境:从暗室搭建到模拟器参数设置(基于国产设备实战)

低成本雷达测试环境搭建实战&#xff1a;国产设备方案与操作指南 在车载毫米波雷达研发领域&#xff0c;测试环节往往占据着项目预算的显著部分。传统方案依赖进口设备和专业暗室&#xff0c;动辄数百万元的投入让许多中小型团队望而却步。本文将揭示一个行业内的真实情况&…...

FDTD Solutions 8.0 保姆级上手教程:从软件安装到第一个仿真结果

FDTD Solutions 8.0 零基础实战指南&#xff1a;从安装到首个完整仿真 当你第一次打开FDTD Solutions 8.0时&#xff0c;那些复杂的工具栏和陌生的术语可能会让你望而却步。作为一款专业的光学仿真软件&#xff0c;它确实有着陡峭的学习曲线——但别担心&#xff0c;这正是本文…...

量子计算安全:NISQ时代的串扰攻击与防御策略

1. 量子计算安全背景与挑战在NISQ&#xff08;Noisy Intermediate-Scale Quantum&#xff09;时代&#xff0c;量子计算机面临着两个核心矛盾&#xff1a;一方面&#xff0c;硬件资源极度稀缺&#xff0c;单个量子程序往往无法充分利用全部量子比特&#xff1b;另一方面&#x…...