Spring初学入门(跟学笔记)

一、Spring概述

Spring是一款主流的Java EE轻量级开源框架。
Spring的核心模块:IoC(控制反转,指把创建对象过程交给Spring管理 )、AOP(面向切面编程,在不修改源代码的基础上增强代码功能)

二、Spring入门

2.1 入门案例开发步骤

  1. 引入spring相关依赖
  2. 创建类,定义属性和方法
  3. 按照spring要求创建配置文件
  4. 在spring配置文件中配置相关信息
  5. 进行测试

2.2 案例开发实例
创建一个spring maven项目名为Spring6,再在Spring6下面创建一个名为Spring-first的模块,在此模块下的pom.xml里增加依赖。

<dependencies><!-- 第2.1个spring context依赖(这是spring的基础依赖) --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.7</version><!--如果是JDK17及以上的,就写6.0.0版本+--></dependency><!--第2.2个spring junit依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version>
<!--            <scope>test</scope>--></dependency></dependencies>

复制之后,点击m小图标进行联网下载。
在这里插入图片描述

创建一个User类,里面创建一个add方法。

public class User {public void add(){System.out.println("添加。。。");}
}

创建一个bean.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--    完成user对象创建-->
<!--    id属性:唯一标识-->
<!--    class属性:要创建的对象所在类的全路径--><bean id="user" class="com.hbnu.spring6.User"/>
</beans>

再写一个测试类,测试方法调用

public class TestUser {
//这里的注解要导入 import org.junit.Test;@Testpublic void testUser(){//加载spring配置文件,创建对象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");//获取创建的对象User user = (User) applicationContext.getBean("user");//getBean --> xml文件里的id值System.out.println(user);//使用对象调用方法进行测试user.add();}
}

如果是利用反射创建对象呢?

//利用反射创建对象public void testUserObject1() throws Exception {Class clazz=Class.forName("com.hbnu.spring6.User");//调用方法创建对象User user = (User) clazz.getDeclaredConstructor().newInstance();System.out.println(user);user.add();}

三、容器:IoC

IoC是Inversion of Control的简写,译为”控制反转”,是一种设计思想(不是一种技术),是一个重要的面向对象编程法则,是Spring框架中最重要的核心组件之一。
Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由IoC容器管理的Java对象称为Spring Bean,它与new一个对象没有区别。

控制反转,反转的是什么?

  • 将对象的创建权力交出去,交给第三方容器负责
  • 将对象和对象之间关系的维护权交出去,交给第三方容器负责

控制反转这种思想如何实现?

  • DI :依赖注入

3.1 依赖注入
指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
常见方式包括两种:

  • set注入
  • 构造注入

3.2 IoC容器在Spring的实现

IoC容器中管理的组件也叫做bean,在创建bean之前,首先要创建IoC容器。Spring提供了两种实现方式:

BeanFactory 是IoC容器的基本实现,是Spring内部使用的接口,面向Spring本身,不提供给开发人员

ApplicationContext 是BeanFactory的子接口,提供了更多高级特性,面向Spring的使用者

ApplicationContext的主要实现类:
在这里插入图片描述

3.3 基于xml管理bean

1.获取bean

xml文件里配置id值

<bean id="user" class="com.hbnu.spring6.User"/>

①根据id获取

public void test1(){ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");User user = (User) applicationContext.getBean("user");
}

②根据id和类型获取

public void test2(){ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");User user = applicationContext.getBean("user",User.class);
}

③根据类型获取

public void test3(){ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");User user = applicationContext.getBean(User.class);
}

且当根据类型获取bean的时候,要求ioc容器里指定类型(class)的bean只允许有一个,配置了两个会报错。即下面两行是错的。

<bean id="user" class="com.hbnu.spring6.User"/>
<bean id="user1" class="com.hbnu.spring6.User"/>

注意:①如果组件类实现了接口,根据接口类型可以获取bean吗?可以,前提是bean唯一 ②如果一个接口有多个实现类,这些实现类都配置了bean,根据接口类型可以获取bean吗?不行,因为bean不唯一

以下是错误的:

<!--    一个接口实现类获取过程--><bean id="UserDaoImpl" class="com.hbnu.spring6.bean.UserDaoImpl"/><bean id="PersonDaoImpl" class="com.hbnu.spring6.bean.PersonDaoImpl"/>
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");UserDao userDao = applicationContext.getBean(UserDao.class);System.out.println(userDao);userDao.run();

2.依赖注入

如果是原生Java,set方法和构造器方法怎么注入?

		//set方法注入Book book=new Book();book.setAuthor("牛顿");//通过构造器注入Book book1=new Book("1","鹤");

接着看用配置文件如何注入。。。

①根据set方法注入
创建一个Book类,定义属性,生成属性set方法之后,在spring配置文件里配置。。。

<!--    1.set方法完成注入--><bean id="book" class="com.hbnu.spring6.DI.Book"><property name="bname" value="spring"/><property name="author" value="小唐"/></bean><!--name对应Book类里面的属性-->

测试一下set方法注入:

@Testpublic void testSet(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-DI.xml");Book book = (Book)applicationContext.getBean("book");System.out.println(book);//Book{bname='spring', author='小唐'}}

输出Book类里重写的toString

②根据构造器注入
创建一个Book类,定义属性,生成有参数的构造方法,在spring配置文件里配置。。。

<!--    2.有参构造注入--><bean id="bookCons" class="com.hbnu.pojo.Book"><constructor-arg name="author" value="小李"/><constructor-arg name="name" value="Spring学习之有参构造注入"/></bean>

测试跟上面一样,只是配置文件里写的内容不一样了

3.特殊值处理

①字面量赋值
②null值 用null标签表示空值
③xml实体 用&lt;&gt;表示大小尖括号
④CDATA节 <![CDATA[a<b]]>

4.为对象类型属性赋值

创建两个类对象:dept和emp
在emp类里写一个work方法

public class Emp {//对象类型属性:员工属于某个部门private Dept dept;private String ename;private String age;public void work(){System.out.println(ename+" is working...");dept.info();}...}

①引用外部bean

    1.引用外部bean注入<bean id="dept" class="com.hbnu.DITest.Dept"><property name="dname" value="安保部"/></bean><bean id="emp" class="com.hbnu.DITest.Emp">
<!--        普通类型属性注入--><property name="ename" value="lucy"/><property name="age" value="23"/>
<!--        对象类型属性注入-->
<!--        表示引入外部bean,这里的ref是上面id为dept的值--><property name="dept" ref="dept"/></bean>

②使用内部bean

<!--    2.使用内部bean注入--><bean id="emp" class="com.hbnu.DITest.Emp"><property name="age" value="25"/><property name="ename" value="joey"/><property name="dept"><bean id="dept" class="com.hbnu.DITest.Dept"><property name="dname" value="财务部"/></bean></property></bean>

③ 使用级联赋值

<!--    3.级联赋值--><bean id="emp" class="com.hbnu.DITest.Emp"><property name="ename" value="mary"/><property name="age" value="25"/><property name="dept" ref="dept"/><property name="dept.dname" value="测试部"/></bean><bean id="dept" class="com.hbnu.DITest.Dept"><!--这一行可要可不要,仅作参考,上面已经给部门名称赋值为了测试部--><property name="dname" value="技术部"/></bean>

测试

@Testpublic void testemp(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-ditest.xml");Emp emp=applicationContext.getBean("emp",Emp.class);emp.work();}

5.复杂类型注入

①数组类型注入

在 Emp 类里面加一个数组属性private String[] hobbies;后生成get、set方法,编写xml文件

<!--    数组类型赋值--><bean id="dept" class="com.hbnu.DITest.Dept"/><bean id="emp" class="com.hbnu.DITest.Emp"><property name="ename" value="tom"/><property name="age" value="34"/><property name="dept" ref="dept"/><property name="hobbies"><array><value>抽烟</value><value>喝酒</value><value>烫头</value></array></property></bean>

②集合类型注入

在Dept类里加一个员工listprivate List<Emp> empList;,一个部门里可以有多个员工

<!--    为list集合赋值--><bean id="emp1" class="com.hbnu.DITest.Emp"><property name="ename" value="tom1"/><property name="age" value="31"/></bean><bean id="emp2" class="com.hbnu.DITest.Emp"><property name="ename" value="tom2"/><property name="age" value="32"/></bean><bean id="dept" class="com.hbnu.DITest.Dept"><property name="dname" value="技术部"/><property name="empList"><list><ref bean="emp1"></ref><ref bean="emp2"></ref></list></property></bean>

输出技术部里的员工:

Dept{dname='技术部', empList=[Emp{dept=null, ename='tom1', age='31', hobbies=null}, Emp{dept=null, ename='tom2', age='32', hobbies=null}]}

③map类型注入

创建Student和Teacher类
对于学生来说,一个学生对应多个讲师

<!--    map类型注入--><bean id="teacherone" class="com.hbnu.DITest.Teacher"><property name="tid" value="121"/><property name="tname" value="莉莉"/></bean><bean id="teachertwo" class="com.hbnu.DITest.Teacher"><property name="tid" value="122"/><property name="tname" value="小月"/></bean><bean id="student" class="com.hbnu.DITest.Student"><property name="sid" value="111"/><property name="sname" value="张三"/><property name="teacherMap"><map><entry><key><value>10010</value></key><ref bean="teacherone"></ref></entry><entry><key><value>10011</value></key><ref bean="teachertwo"></ref></entry></map></property></bean>

输出{10010=Teacher{Tname='莉莉', Tid='121'}, 10011=Teacher{Tname='小月', Tid='122'}}

④引用集合类型的bean

创建一个Lesson类(getter、setter、重写toString),再在Student类里面加一个 public List<Lesson> lessonList;,一个学生有多个老师,选多门课

<bean id="lesson1" class="com.hbnu.DITest.Lesson"><property name="lessonname" value="前端开发"/></bean><bean id="lesson2" class="com.hbnu.DITest.Lesson"><property name="lessonname" value="java开发"/></bean><bean id="teacher1" class="com.hbnu.DITest.Teacher"><property name="tname" value="张老师"/><property name="tid" value="001"/></bean><bean id="teacher2" class="com.hbnu.DITest.Teacher"><property name="tname" value="王老师"/><property name="tid" value="002"/></bean><bean id="student" class="com.hbnu.DITest.Student"><property name="sid" value="1000"/><property name="sname" value="lucy"/><!--        注入list、map类型属性--><property name="lessonList" ref="lessonlist"/><property name="teacherMap" ref="teachermap"/></bean><util:list id="lessonlist"><ref bean="lesson1"/><ref bean="lesson2"/></util:list><util:map id="teachermap"><entry><key><value>10010</value></key><ref bean="teacher1"/></entry><entry><key><value>10011</value></key><ref bean="teacher2"/></entry></util:map>
</beans>

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:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

输出:

{10010=Teacher{Tname='张老师', Tid='001'}, 10011=Teacher{Tname='王老师', Tid='002'}}
[Lesson{lessonname='前端开发'}, Lesson{lessonname='java开发'}]

脱离数据库思想注入复杂类型,创建一个dataType类,里面拥有private String[] arr;private List<String> lists;private Map<String,String> maps;private Properties properties;属性,编写xml文件:

<!--        注入复杂类型--><bean id="dataType" class="com.hbnu.pojo.DataType">
<!--                1.注入数组类型--><property name="arr"><list><value>斯蒂芬金</value><value>毛姆</value><value>陀思妥耶夫斯基</value><value>茨威格</value></list></property><!--                2.注入list集合类型--><property name="lists"><list><value>马克吐温</value><value>马克吐温</value><value>马克吐温</value><value>马克吐温</value></list></property><!--                3.注入map集合类型--><property name="maps"><map><entry key="username" value="雨果"/><entry key="age" value="1984"/></map></property><!--                4.注入properties--><property name="properties"><props><prop key="driverClass">com.mysql.cj.jdbc.Driver</prop><prop key="url">jdbc:mysql://localhost:3306/class2110?serverTimezone=GMT&amp;useSSL=false</prop><prop key="username">root</prop><prop key="password">123456</prop></props></property></bean>

6.p命名空间

<!--    p命名空间注入--><bean id="studentp" class="com.hbnu.DITest.Student"p:sid="100" p:sname="mary" p:lessonList-ref="lessonlist" p:teacherMap-ref="teachermap">

头部加一行

xmlns:p="http://www.springframework.org/schema/p"

7.bean的作用域

概念
在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围

取值含义创建对象的时机
singleton在IOC容器中,这个bean的对象始终为单实例IOC容器初始化时
prototype这个bean在IOC容器中有多个实例获取bean时
    @Testpublic void testOrders(){ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-ditest.xml");Orders orders=applicationContext.getBean("orders",Orders.class);Orders orders2=applicationContext.getBean("orders",Orders.class);System.out.println(orders);System.out.println(orders2);}

8.bean的生命周期

1.bean对象创建(调用无参数构造)
2.给bean对象设置相关属性
3.bean后置处理器(初始化之前)
4.bean对象初始化(调用指定初始化方法)
5.bean后置处理器(初始化之后)
6.bean对象创建完成
7.bean对象销毁(配置指定销毁的方法)
8.IoC容器关闭

3.4 基于注解管理bean
步骤:1.引入依赖 2.开启组件扫描 3.使用注解定义bean 4.依赖注入

1.开启组件扫描
开启组件扫描(开启此功能后,spring就会自动从扫描指定的包,及其子包下的所有类。如果类上使用了@Component注解,就将该类装配到容器中)

<context:component-scan base-package="com.hbnu"></context:component-scan>

2.使用注解定义bean

注解说明
@Component该注解用于描述Spring中的bean,仅仅表示容器中的一个组件,并且可以作用在应用的任何层次,例如Service层,Dao层。
@Repository该注解用于将数据访问层(Dao层)的类标识为S加粗样式pring中的bean,其功能与@Component相同
@Service该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的bean,其功能与@Component相同
@Controller该注解通常作用在控制层(如SpringMVC中的Controller),用于将控制层的类标识为Spring中的bean,其功能与@Component相同

3.@Autowired注入

注入可以理解为导包,注入后就可以调用方法
在controller里注入service,在service里注入dao

写个测试感受一下@Autowired注入…项目结构如下:
在这里插入图片描述
首先在bean.xml里编写代码进行包扫描,然后创建UserDao以及其实现类,
在这里插入图片描述
在这里插入图片描述

接着创建UserService以及其实现类,并将UserDao注入到UserService中。
在这里插入图片描述
在这里插入图片描述
最后创建UserController,将UserService注入后进行测试。
在这里插入图片描述

public class Test {public static void main(String[] args) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");UserController userController=applicationContext.getBean(UserController.class);userController.add();}
}

在这里插入图片描述

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

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

相关文章

常用五款文件加密软件|好用加密软件工具分享

随着信息化时代的到来&#xff0c;数据安全问题日益凸显&#xff0c;加密软件应运而生&#xff0c;成为了保护数据安全的重要手段。在市场上&#xff0c;众多加密软件层出不穷&#xff0c;各有千秋。本文将介绍几款常用的加密软件&#xff0c;分析它们的优缺点&#xff0c;以帮…

使用JasperReport工具,生成报表模版,及通过JavaBean传参,常见问题及建议

1.下载JasperReport工具 下载地址:社区版 - Jaspersoft 社区 邮箱:lorettepatri.ckoa5434gmail.com 密码:Zx123456. 2.工具使用方法注意 1.一次参数需要在左下角Parameters中新建,直接拖转右上角的TextField不会自动新建参数,到头来还是要在Parameters中新建 2.循环参数需…

Kexp 动态展示 k8s 资源对象依赖关系

kexp[1] 旨在以可视化的方式帮助用户理解和探索 Kubernetes 的能力。 适用场景&#xff1a; 学习和探索 Kubernetes 的功能。 应用开发&#xff0c;提供每个应用的对象图预设。 控制器和操作器的开发&#xff0c;支持动态对象图。 即将推出类似 Postman 的 Kubernetes API …

如何组织 Vue 项目

介绍 在启动 Vue 项目时&#xff0c;思考项目结构至关重要。主要考虑因素是预期项目的规模。在本篇博文中&#xff0c;我将探讨适用于不同规模 Vue 项目的各种结构。这个考虑与康威定律相吻合&#xff1a; “设计系统的组织受限于产生这些组织沟通结构的设计。” - 梅尔康威 基…

linux防火墙的操作

linux防火墙的操作 前言1查看防火墙状态2暂时关闭防火墙3永久关闭防火墙4开启防火墙5开启指定端口6关闭指定端口7立即生效8查看开放的端口 前言 systemctl是管理linux中服务的命令&#xff0c;可以对服务进行启动、停止、重启、查看状态等操作 firewall-cmd是linux中专门用于控…

shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式

sort命令 uniq命令 tr命令 cut命令 sphit命令 paste命令 ecal命令 正则表达式 sort命令 sort命令---以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序…

Centos7使用kubeadm搭建k8s集群(一主两从)----(mac版)

一、环境准备 1、下载centos7镜像 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载地址: centos安装包下载_开源镜像站-阿里云 选择对应的版本即可&#xff0c;我下载的&#xff1a;CentOS-7-x86_64-DVD-2207-02.iso 2、使用VirtualBox安装centos 选择新建&#xff0c…

集成了Gemini的Android Studio,如虎添翼

今天将Android Studio升级到最新版&#xff08;Jellyfish&#xff09;。发现在new features中有一条&#xff1a; Code suggestions with Gemini in Android Studio 打开路径为&#xff1a; View > Tool Windows > Gemini 支持多国语言&#xff0c;英文、中文都能正确理解…

C# 快速排序(QuickSort)

QuickSort是一种基于分而治之算法的排序算法&#xff0c;它选择一个元素作为主元&#xff0c;并通过将主元放置在已排序数组中的正确位置&#xff0c;围绕所选主元对给定数组进行分区。 快速排序是如何工作的&#xff1f; QuickSort中的关键过程是partition()。分区的…

二手手机行业商家如何利用二手机店erp进行破局?

在数字化和AI发展越发先进的的今天&#xff0c;二手手机市场正迎来前所未有的变革。途渡科技精心打造的超机购ERP管理软件&#xff0c;凭借其独特的智能化、高效化特点&#xff0c;正在引领这场变革&#xff0c;为二手手机商家提供全面、深度的数字化管理解决方案。二手手机商家…

【FFmpeg】Filter 过滤器 ② ( 裁剪过滤器 Crop Filter | 裁剪过滤器语法 | 裁剪过滤器内置变量 | 裁剪过滤器常用用法 )

文章目录 一、裁剪过滤器1、裁剪过滤器简介2、裁剪过滤器语法3、裁剪过滤器内置变量4、裁剪过滤器示例5、裁剪过滤器应用6、裁剪过滤器图示 二、裁剪过滤器常用用法1、裁剪指定像素的视频区域2、裁剪视频区域中心正方形 - 默认裁剪3、裁剪视频区域中心正方形 - 手动计算4、裁剪…

Postman历史版本安装与runner测试

前言 实际上就是笔者本地做demo&#xff0c;postman使用了最新版本&#xff0c;本身也没问题&#xff0c;不过postman不支持不登录做runner测试了&#xff0c;很多功能必须登录账号才能使用&#xff0c;否则只能使用http工具发送的能力&#xff0c;而postman本身就是一个简单工…

每周题解:牛的旅行

题目描述 牛的旅行 农民John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言&#xff0c;你能看到至少有两个牧区不连通。 现在&#xff0c;John想在农场里添加一条路径 ( 注意&#xff0c;恰好一条 )。对这条路径有这样的…

nuget局域网在线包制作,nuget打包,nuget打自己的包

目录 首先编辑类库项目的.csproj文件信息 打包项目 设置局域网nuget包 Nuget包管理器--->程序包源 微软帮助文档&#xff1a; NuGet 及其功能介绍 | Microsoft Learn https://learn.microsoft.com/zh-cn/nuget/what-is-nuget 承载自己的 NuGet 源 https://learn.mic…

Python 小抄

Python 备忘单 目录 1.语法和空格 2.注释 3.数字和运算 4.字符串处理 5.列表、元组和字典 6.JSON 7.循环 8.文件处理 9.函数 10.处理日期时间 11.NumPy 12.Pandas 要运行单元格&#xff0c;请按 ShiftEnter 或单击页面顶部的 Run&#xff08;运行&#xff09;。 1.语法和空格…

垃圾分类管理系统java项目

文章目录 垃圾分类管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 垃圾分类管理系统 一、项目演示 垃圾分类管理系统 二、项目介绍 系统角色&#xff1a;管理员、用户 1、登录、注册功能…

析构函数详解

目录 析构函数概念特性对象的销毁顺序 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;️ C语言例题 &…

2024042002-计算机网络 - 应用层

计算机网络 - 应用层 计算机网络 - 应用层 域名系统文件传送协议动态主机配置协议远程登录协议电子邮件协议 1. SMTP2. POP33. IMAP 常用端口Web 页面请求过程 1. DHCP 配置主机信息2. ARP 解析 MAC 地址3. DNS 解析域名4. HTTP 请求页面 域名系统 DNS 是一个分布式数据库&…

24长三角数学建模ABC题已出!!!

需要ABC题资料的宝子们可以进企鹅 赛题如下&#xff1a; 赛道 A&#xff1a;“抢救”落水手机 上有天堂&#xff0c;下在苏杭&#xff1b;五一假期&#xff0c;杭州西湖、西溪湿地、京杭大运河等著名 景点&#xff0c;游人如织&#xff0c;作为享誉国内外的旅游胜地&#xff0…

华为OD机试 - 山峰个数(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…