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

Spring03——基于xml的Spring应用

Spring开发中主要对Bean的配置

Bean的常用配置一览如下:

Xml配置方式功能描述
<bean id="" class="">Bean的id和全限定名配置
<bean name="">通过name设置Bean的别名,通过别名也能直接获取到Bean实例
<bean scope="">Bean的作用范围,BeanFactory作为容器时取值singleton和prototype
<bean lazy-init="">Bean的实例化时机,是否延迟加载。BeanFactory作为容器时无效
<bean init-method="">Bean实例化后自动执行的初始化方法,method指定方法名
<bean destroy-method="">Bean实例销毁前的方法,method指定方法名
<bean autowire="byType">设定自动注入模式,常用的有按类型byType,按名称byName
<bean factory-bean="" factory-method=""/>指定哪个工厂Bean的哪个方法来完成Bean的创建

 Bean取别名

通过name取别名,同样可以获取实例

 

Bean的范围配置

默认情况下,单纯的Spring环境Bean的作用范围有两个(scope配置):Singleton和Prototype

  • singleton:单例,默认值,Spring容器创建的时候,就会进行Bean的实例化,并存储到容器内部的单例池中,每次getBean时都是从单例池中获取相同的Bean实例;
  • prototype(默认):原型,Spring容器初始化时不会创建Bean实例,当调用getBean时才会实例化Bean,每次getBean都会创建一个新的Bean实例。

Bean的延迟加载

当lazy-init设置为true时为延迟加载,也就是当Spring容器创建的时候,不会立即创建Bean实例等待用到时在创建Bean实例并存储到单例池中去,后续在使用该Bean直接从单例池获取即可本质上该Bean还是单例

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" lazy-init="true"/> 
        ApplicationContext applicationContext = new                 ClassPathXmlApplicationContext("applicationContext.xml");// lazy-init="true"开启,那么只有调用getBean时才会创建Bean实例,而不是之前创建容器时UserService userService = (UserService) applicationContext.getBean("aaa");System.out.println(userService);

Bean的初始化和销毁方法配置

Bean在被实例化后,可以通过指定的初始化方法完成一些初始化的操作,Bean在销毁之前也可以执行指定的销毁方法完成一些操作。

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"init-method="init" destroy-method="destroy"/>

定义init方法和destory方法 

public class UserDaoImpl implements UserDao {  public UserDaoImpl() { System.out.println("UserDaoImpl创建了..."); }  public void init() { System.out.println("初始化方法..."); }  public void destroy() { System.out.println("销毁方法..."); }  
}

 

 由上图可见,并没有显示销毁方法

关闭容器Bean就销毁,否则bean销毁不了,因为关闭容器是在虚拟机结束之前执行,如果没有close,那么虚拟机关闭,什么都没有了。 

扩展:除此之外,我们还可以通过实现 InitializingBean 接口,完成一些Bean的初始化操作,如下:

public class UserDaoImpl implements UserDao, InitializingBean {  public UserDaoImpl() { System.out.println("UserDaoImpl创建了..."); }  public void init() { System.out.println("初始化方法..."); }  public void destroy() { System.out.println("销毁方法..."); }  // 执行时机早于init-method配置的方法  @Overridepublic void afterPropertiesSet() throws Exception {  System.out.println("InitializingBean...");  }  
}

  使用InitializingBean , DisposableBean接口(推荐)

 这样就不需要再Bean标签里写init和destory了

Bean的生命周期 

下面是Spring Bean生命周期示例,包括创建、初始化和销毁的代码。

Bean类

创建一个简单的Bean类,并定义初始化和销毁方法:

import org.springframework.beans.factory.InitializingBean;  
import org.springframework.beans.factory.DisposableBean;  public class MyBean implements InitializingBean, DisposableBean {  private String name;  private String version;  private String author;  public MyBean() {  System.out.println("1. 创建对象 - 构造器");  }  public void setName(String name) {  this.name = name;  System.out.println("设置属性 - name: " + name);  }  public void setVersion(String version) {  this.version = version;  System.out.println("设置属性 - version: " + version);  }  public void setAuthor(String author) {  this.author = author;  System.out.println("设置属性 - author: " + author);  }  @Override  public void afterPropertiesSet() throws Exception {  System.out.println("4. 执行Bean初始化方法 (afterPropertiesSet)");  System.out.println("Bean 信息 - Name: " + name + ", Version: " + version + ", Author: " + author);  }  @Override  public void destroy() throws Exception {  System.out.println("关停 Bean - 销毁方法 (destroy)");  }  public void performTask() {  System.out.println("执行业务操作 - " + name);  }  
}

Spring配置

使用XML配置来定义Bean,指定其由接口管理的初始化和销毁方法:

 <bean id="myBean" class="com.example.MyBean">  <property name="name" value="Spring Bean"/>  <property name="version" value="1.0"/>  <property name="author" value="John Doe"/>  </bean>  

主程序

创建Application类,加载Spring上下文,使用Bean并关闭上下文以触发销毁阶段:

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  public class Application {  public static void main(String[] args) {  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  MyBean myBean = (MyBean) context.getBean("myBean");  // 执行myBean的一些业务// 关闭上下文,触发销毁方法  ((ClassPathXmlApplicationContext) context).close();  }  
}

Bean的3种实例化

构造方式实例化:底层通过构造方法对Bean进行实例化  

工厂方式实例化:底层通过调用自定义的工厂方法对Bean进行实例化

Bean的实例化配置

构造方式实例化Bean又分为无参构造方法实例化和有参构造方法实例化,Spring中配置的<bean>几乎都是无参构造方式,但处不在赘述。下面讲解有参构造方法实例化Bean

// 有参构造方法  
public UserDaoImpl(String name){  
}

在实现类文件里默认有一个无参构造器,如果写一个有参构造器,那么jvm识别不到无参构造器会报错 。

在实现类文件中写入有参构造方法后,有参构造在实例化Bean时,需要参数的注入,通过<constructor-arg>标签(name表示传入的变量名,value表示变量名对应的传入参数,在bean标签里传入即可,调用getBean会自动添加进去,如果有多个参数,就多个<constructor-arg>标签),嵌入在<bean>标签内部提供构造参数,如下:

        <!--上面的有参构造器对应的xml配置-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">  <constructor-arg name="name" value="haohao"/>  
</bean>

静态工厂创建对象

factory-method 创建对象:即在xml的bean标签里配置factory-method = "userDao",那么创建getBean对象返回的不是class对应的类的实例,而是class类里面userDao静态方法返回的实例

<bean id="userDao1" class="com.itheima.factory.MyBeanFactory1"factory-method="userDao"></bean>
public class MyBeanFactory1 {public static UserDao userDao(){// bean之前可以进行其他的业务逻辑操作return new UserDaoImpl();}
}

实例工厂创建对象

<--实例化一个工厂-->
<bean id="myBeanFactory2" class="com.itheima.factory.MyBeanFactory2"lazy-init="true"></bean>
<--factory-bean是代指工厂-->
<bean id="userDao2" factory-bean="myBeanFactory2" 
factory-method="userDao" lazy-init="true"></bean>

public class MyBeanFactory2 {
// 实例方法返回对象public UserDao userDao(){return new UserDaoImpl();}
}

FactoryBean创建(实用)

package com.itheima.factory;import com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;public class UserDaoFactoryBean implements FactoryBean {// 返回bean@Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}// 返回Bean的类型@Overridepublic Class<?> getObjectType() {return UserDao.class;}
// 是否为单例@Overridepublic boolean isSingleton() {return true;}
}
<bean id="UserDao" class="com.itheima.factory.UserDaoFactoryBean"></bean>

 依赖注入的方式

一、setter方法注入引用类型/简单类型(下面以同时注入这两种类型为例)

假设我们有一个Product类,它包含一个简单类型属性(如productId)和一个引用类型属性(如Category)。

1. 定义Category

首先,定义Category类,表示产品类别:

public class Category {  private String categoryName;  // Setter方法  public void setCategoryName(String categoryName) {  this.categoryName = categoryName;  }  // Getter方法  public String getCategoryName() {  return categoryName;  }  public void displayInfo() {  System.out.println("Category: " + categoryName);  }  
}

2. 定义Product

接下来,定义一个Product类,它具有一个简单类型的productId和一个引用类型的Category

public class Product {  private String productId; // 简单类型  private Category category; // 引用类型  // Setter方法注入  public void setProductId(String productId) {  this.productId = productId;  }  public void setCategory(Category category) {  this.category = category;  }  public void displayProductInfo() {  System.out.println("Product ID: " + productId);  if (category != null) {  category.displayInfo();  } else {  System.out.println("No category information available.");  }  }  
}

3. Spring配置文件

在Spring的XML配置文件中,定义CategoryProduct的Bean,并同时注入简单类型和引用类型:

<!-- applicationContext.xml -->  
<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 id="category" class="com.example.Category">  <property name="categoryName" value="Electronics"/> <!-- 注入简单类型 -->  </bean>  <bean id="product" class="com.example.Product">  <property name="productId" value="P12345"/>        <!-- 注入简单类型name是形参 -->  <property name="category" ref="category"/>         <!-- 注入引用类型 -->  </bean>  
</beans>

4. 主程序

最后,创建一个主程序,通过Spring上下文来获取Product对象并执行相应操作:

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  public class Application {  public static void main(String[] args) {  // 加载Spring上下文  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  // 获取product Bean  Product product = (Product) context.getBean("product");  product.displayProductInfo(); // 显示产品信息  // 关闭上下文  ((ClassPathXmlApplicationContext) context).close();  }  
}

运行结果

运行程序将输出以下内容:

Product ID: P12345  
Category: Electronics

二、构造器注入引用类型/简单类型(下面以同时注入这两种类型为例)

1. 定义Category

Category类保持不变,依然表示产品类别

2. 定义Product

Product类的构造函数修改为接收两个参数:一个简单类型productId和一个引用类型Category

public class Product {  private String productId; // 简单类型  private Category category; // 引用类型  // 构造函数注入  public Product(String productId, Category category) {  this.productId = productId;  this.category = category;  }  public void displayProductInfo() {  System.out.println("Product ID: " + productId);  if (category != null) {  category.displayInfo();  } else {  System.out.println("No category information available.");  }  }  
}

3. Spring配置文件

在Spring的XML配置文件中,使用构造器来注入简单类型和引用类型。我们可以使用constructor-arg来指定构造函数参数:

<!-- applicationContext.xml -->  
<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 id="category" class="com.example.Category">  <property name="categoryName" value="Electronics"/> <!-- 注入简单类型 -->  </bean>  <bean id="product" class="com.example.Product">  <constructor-arg value="P12345"/>              <!-- 注入简单类型 -->  <constructor-arg ref="category"/>               <!-- 注入引用类型 -->  </bean>  
</beans>

4. 主程序

主程序实例保持不变,只是调用已经不同的注入手段(构造器)来获取Product对象并执行操作

  • 强制依赖使用构造器进行,使用setter注入有概率不进行时导致null对象出现
  • 可选依赖使用setter注入进行,灵活性强
  • Spring框架倡导使用构造器,第三方框架内部多数采用构造器注入的形式进行数据初始化,相对严谨
  • 如果有必要可以同时使用,使用构造器注入完全依赖的注入,使用setter注入完成可选依赖的注入
  • 实际开发过程中需要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
  • 自己开发的模块推荐使用setter注入 

依赖自动装配

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时(byType)必须保证容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时(byName)必须保证容器中具有指定名称的bean,因为变量名与配置混合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合的注入

<!-- 定义一个bean,id为bookDao,对应的实现类为com.itheima.dao.impl.BookDaoImpl -->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"><!-- 配置一个名为array的属性,类型为数组 --><property name="array"><!-- 数组元素 --><array><!-- 数组中的值 --><value>100</value><value>200</value><value>300</value></array></property><!-- 配置一个名为list的属性,类型为列表 --><property name="list"><!-- 列表元素 --><list><!-- 列表中的值 --><value>itcast</value><value>itheima</value><value>boxuegu</value><value>chuanzhihui</value></list></property><!-- 配置一个名为set的属性,类型为集合 --><property name="set"><!-- 集合元素 --><set><!-- 集合中的值,注意集合不允许重复值 --><value>itcast</value><value>itheima</value><value>boxuegu</value><!-- 重复的值boxuegu将被忽略 --><value>boxuegu</value></set></property><!-- 配置一个名为map的属性,类型为映射 --><property name="map"><!-- 映射元素 --><map><!-- 映射中的键值对 --><entry key="country" value="china"/><!-- 可以继续添加更多的键值对 --></map></property>
</bean>

相关文章:

Spring03——基于xml的Spring应用

Spring开发中主要对Bean的配置 Bean的常用配置一览如下&#xff1a; Xml配置方式功能描述<bean id"" class"">Bean的id和全限定名配置<bean name"">通过name设置Bean的别名&#xff0c;通过别名也能直接获取到Bean实例<bean sc…...

【AIGC半月报】AIGC大模型启元:2024.12(上)

【AIGC半月报】AIGC大模型启元&#xff1a;2024.12&#xff08;上&#xff09; &#xff08;1&#xff09;OpenAI-12日发布会&#xff08;持续更新中........&#xff09;Day01-12.06&#xff1a;SoraDay02-12.07&#xff1a;ChatGPT圣诞老人风格的语音Day03-12.08&#xff1a;…...

本etcd系列文章补充说明

最开始今年四月份读的是etcdv3.6的main分支的代码&#xff0c;最开始没注意&#xff0c;main分支代码是不断修改的&#xff0c;并且最开始对etcd不太了解&#xff0c;所以源码笔记有些理解不太准确&#xff0c;也可能略有错误&#xff0c;所以年底就回过头来重新复习一遍&#…...

【新品发布】ESP32-P4开发板 —— 启明智显匠心之作,为物联网及HMI产品注入强劲动力

核心亮点&#xff1a; ESP32-P4开发板&#xff0c;是启明智显精心打造的一款高性能物联网开发板。它专为物联网项目及HMI&#xff08;人机界面&#xff09;产品而设计&#xff0c;旨在为您提供卓越的性能和稳定可靠的运行体验。 强大硬件配置&#xff1a; 双核400MHz RISC-V处…...

HTML 添加 文本水印

body,html {margin: 0;height: 100vh;width: 100vw;} // 自定义文案const setting {text: "水印文案", // 水印内容innerDate: true, // 在水印下方增加日期width: 110, // 水印宽度};// 自定义文字水印const watermark (function () {return {build: function (a…...

软件无线电安全之GNU Radio基础(下)

往期回顾 软件无线电安全之GUN Radio基础(上) 背景 在上一小节中&#xff0c;我们简单介绍和使用了GNU Radio软件的基础功能和模块&#xff0c;同时通过GNU Radio Companion&#xff08;GRC&#xff09;创建了简单的流程图&#xff0c;展示了信号生成、处理和输出的流程。最后…...

windows基础

系统目录 服务 端口 注册表 黑客常用DOS命令&#xff08;在拿到shell时会用到&#xff09; 一、 系统目录 Windows目录 系统的安装目录 System32configSAM文件 是用户密码的存储文件 System32etchost文件 记录本地解析&#xff08;优先级大于DNS域名解析&#xff09;可以自…...

hhdb数据库介绍(10-43)

安全 密码安全管理 密码安全管理为用户提供了对计算节点数据库用户与存储节点的连接用户、备份用户的密码有效期监控提醒。到期后自动提示用户修改密码以提升系统的安全性。 数据库用户密码 &#xff08;一&#xff09;密码修改 用户可以在“安全->密码安全管理->数据…...

JMS和消息中间件:Kafka/RocketMQ

文章目录 消息传递模型使用JMS还是KafkaKafka与RocketMQ的优缺点Kafka与RocketMQ的使用场景Kafka与RocketMQ的选型指南 TPM 项目中&#xff0c; iflow之间使用了JMS&#xff0c;后端项目与数据库通信使用Kafka MQ和JMS的区别&#xff1a; JMS是 java 用来处理消息的一个API规范…...

【问题解决】ArcgisGP工具使用GIS模块自动发布图层报错:过渡失败

项目场景&#xff1a; 使用Arcpy脚本发布GP工具服务&#xff0c;该工具结果生成一个矢量文件&#xff0c;并且需要自动发布成在线图层&#xff0c;脚本中已经包含了自动发布图层的代码&#xff0c;本地在ArcgisPro中执行成功。现在需要将该工具发布成web工具。 问题描述 在…...

Yocto bitbake and codeSonar

1 mdm 1.1 屏蔽mdm sysvinit的console输出 - uboot传入参数的时候传入consolenull&#xff0c;这样Linux启动信息没有了 - 还需要在Linux配置中去掉Support for console on AMBA serial port - 文件系统/etc/inittab文件里注释掉::respawn:/sbin/getty -L ttyS000 115200 vt100…...

gpt-computer-assistant - 极简的 GPT-4o 客户端

更多AI开源软件&#xff1a; AI开源 - 小众AIhttps://www.aiinn.cn/sources gpt-computer-assistant是一个将 ChatGPT MacOS 应用程序提供给 Windows 和 Linux 的替代工作。因此&#xff0c;这是一个全新且稳定的项目。此时&#xff0c;您可以轻松地将其作为 Python 库安装&am…...

中国移动量子云平台:算力并网590量子比特!

在技术革新的浪潮中&#xff0c;量子计算以其独特的并行处理能力和指数级增长的计算潜力&#xff0c;有望成为未来技术范式变革和颠覆式创新应用的新源泉。中国移动作为通信行业的领军企业&#xff0c;致力于量子计算技术研究&#xff0c;推动量子计算产业的跨越式发展。 量子云…...

Vue 3 中的计算属性(Computed Properties)详解

目录 Vue 3 中的计算属性&#xff08;Computed Properties&#xff09;详解 引言 什么是计算属性&#xff1f; 创建和使用计算属性 示例 1&#xff1a;基本用法 示例 2&#xff1a;带有 getter 和 setter 的计算属性 计算属性 vs 方法 Vue 3 中的计算属性&#xff08;Co…...

AWS S3 权限配置与文件上传下载指南

本文介绍如何配置 AWS S3 存储桶的访问权限,实现 EC2 实例上传文件和本地用户下载文件的功能。 权限配置 © ivwdcwso (ID: u012172506) 1. EC2 角色上传权限 创建 IAM 角色并附加以下策略,允许 EC2 实例上传文件到 S3: {"Version": "2012-10-17&qu…...

6. 一分钟读懂“抽象工厂模式”

6.1 模式介绍 书接上文&#xff0c;工厂方法模式只能搞定单一产品族&#xff0c;遇到需要生产多个产品族时就歇菜了。于是&#xff0c;在需求的“花式鞭策”下&#xff0c;程序员们再次绷紧脑细胞&#xff0c;创造出了更强大的抽象工厂模式&#xff0c;让工厂一次性打包多个产品…...

CV(2)-插值和卷积

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 看看年前可以学到哪。 频率&#xff1a; 灰度值变化程度的指标&#xff0c;是灰度再平面上的梯度幅值: 幅值&#xff1a; 是在一个周期内&#xff0c;交流电瞬时出现的最大绝对值&#xff0c;也是一个正弦波&#xff0c;波…...

学习threejs,通过设置纹理属性来修改纹理贴图的位置和大小

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Texture 贴图 二、&#x1…...

fastadmin 后台插件制作方法

目录 一&#xff1a;开发流程 二&#xff1a;开发过程 &#xff08;一&#xff09;&#xff1a;后台功能开发 &#xff08;二&#xff09;&#xff1a;功能打包到插件目录 &#xff08;三&#xff09;&#xff1a;打包插件 &#xff08;四&#xff09;&#xff1a;安装插件…...

9. 一分钟读懂“策略模式”

9.1 模式介绍 策略模式是一种行为型设计模式&#xff0c;用于在运行时灵活切换对象的行为或算法&#xff0c;它将算法封装为独立的类&#xff0c;使得它们可以互相替换&#xff0c;而不会影响使用这些算法的客户端代码。 策略模式的核心思想是&#xff1a;定义一系列可互换的算…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...