springboot容器功能

springboot容器

  • 容器功能
    • Spring注入组件的注解
      • @Component,@Controller,@Service,@Repository
      • 案例演示
    • @Configuration
      • 应用实例
        • 传统方式
        • 使用@Configuration
      • 注意事项和细节
    • @Import
      • 应用实例
    • @Conditional
      • @Conditional介绍
      • 应用实例
    • @ImportResource
      • 应用实例
    • 配置绑定
      • 应用实例
      • 注意事项和细节

在这里插入图片描述

容器功能

Spring注入组件的注解

上文中, 我们学习的是sprintboot依赖管理和自动配置

打开quickstart项目

@Component,@Controller,@Service,@Repository

说明:这些在Spring中的传统注解仍然有效,通过这些注解可以给容器注入组件。

案例演示

1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\A.java

@Repository
public class A {}

2.测试MainApp.java, 其它注解不再一一测试.

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);System.out.println("ok");//演示Spring中传统的注解依然可以使用 @controler @service @repositoryA aBean = ioc.getBean(A.class);System.out.println("aBean=" + aBean);}
}

@Configuration

应用实例

●@Configuration应用实例需求
说明: 演示在SpringBoot, 如何通过 @Configuration 创建配置类来注入组件.

传统方式

●回顾传统方式如何通过配置文件注入组件. 基于XML配置bean
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Monster.java

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsContructor
public class Monster {private Integer id;private String name;private Integer age;private String skill;
}

2.创建D:\idea_project\zzw_springboot\quickstart\src\main\resources\beans.xml创建容器配置文件的方式在SpringBoot中依然好使

<!--配置了Monster bean-->
<bean class="com.zzw.springboot.bean.Monster" id="monster"><property name="id" value="100"/><property name="name" value="孙悟空"/><property name="age" value="20"/><property name="skill" value="金箍棒"/>
</bean>

3.在springboot项目中,依然可以使用spring的配置bean/注入bean/获取bean方式

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//=====演示在springboot项目,依然可以使用spring的配置bean/注入bean/获取bean方式 start===ApplicationContext ac =new ClassPathXmlApplicationContext("beans.xml");Monster monster = ac.getBean("monster" , Monster.class);System.out.println("monster=" + monster);//=====演示在springboot项目,依然可以使用spring的配置bean/注入bean/获取bean方式 end=====}
}
使用@Configuration

●使用SpringBoot的@Configuration添加组件
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig.java

配置文件和配置类都差不多, 但是在springboot中开发尽量用配置类来完成Bean的注入.

/*** 解读* 1.@Configuration 表示这是一个配置类,等价于配置文件* 2.程序员可以通过@Bean 注解注入bean对象到容器* 3.当一个类被 @Configuration 标识, 该类-Bean 也会注入到容器*/
@Configuration
public class BeanConfig {/*** 解读* 1.@Bean: 给容器添加组件, 就是一个Monster bean* 2.monster01(): 默认 你的方法名monster01 作为bean的名字/id* 3.Monster: 注入类型, 注入bean的类型时Monster* 4.new Monster(200, "牛魔王" , 500 , "芭蕉扇"); 注入到容器中具体的bean信息* 5.@Bean(name = "monster_nmw"): 在配置/注入 bean 指定名字/id monster_nmw* 6.默认是单例注入* 7.通过 @Scope("prototype") 可以每次返回新的对象, 指定bean对多例*///@Bean(name = "monster_aliasName")@Beanpublic Monster monster01() {return new Monster(200, "牛魔王" , 500 , "芭蕉扇");}
}

2.修改MainApp.java, 从配置文件/容器获取bean, 并完成测试
hashCode含义

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示在springboot项目中,@Configuration的使用 start===Monster monster01 = ioc.getBean("monster01" , Monster.class);Monster monster02 = ioc.getBean("monster01" , Monster.class);System.out.println("monster01=" + monster01 + " " + monster01.hashCode());System.out.println("monster02=" + monster02 + " " + monster02.hashCode());//=====演示在springboot项目中,@Configuration的使用 end=====}
}

3.也可以通过Debug来查看 ioc 容器是否存在 monster01 的 Bean实例

ioc->beanFactory->beanDefinitionMap->monster01
在这里插入图片描述

注意事项和细节

1.配置类本身也是组件, 因此也可以获取. 修改MainApp.java
配置类是CGLIB代理对象. 动态代理jdk的Proxy和Spring的CGlib

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示 配置类-bean也会注入到容器 start===BeanConfig beanConfig = ioc.getBean("beanConfig", BeanConfig.class);System.out.println("beanConfig=" + beanConfig + " " + beanConfig.hashCode());//=====演示 配置类-bean也会注入到容器 end=====}
}

2.SpringBoot2新增特性: proxyBeanMethods 指定 Full模式 和 Lite模式
1)修改D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig.java

/*** 第二部分解读* 1.proxyBeanMethods: 代理bean的方法* 2.Full(proxyBeanMethods = true): (默认)保证每个@Bean方法被调用多少次返回的组件都是单例的, 是代理方法* 3.Lite(proxyBeanMethods = false): 保证每个@Bean方法被调用多少次返回的组件都是新创建的, 是非代理方法* 4.特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效. 因此, 需要先获取BeanConfig 组件, 再调用方法* 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效* 5.如何选择: 组件依赖必须使用默认 Full模式, 如果不需要组件依赖则使用 Lite模式.* 6.Lite模式: 也称为轻量级模式, 因为不检测依赖关系, 所以运行速度快*/
@Configuration(proxyBeanMethods = false)
public class BeanConfig {}

2)修改MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示 @Configuration(proxyBeanMethods = xxx) start===//1.先得到BeanConfig组件BeanConfig beanConfig = ioc.getBean("beanConfig", BeanConfig.class);Monster monster_01 = beanConfig.monster01();Monster monster_02 = beanConfig.monster01();System.out.println("monster_01--" + monster_01 + " " + monster_01.hashCode());System.out.println("monster_02--" + monster_02 + " " + monster_02.hashCode());//特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效. 因此, 需要先获取BeanConfig 组件, 再调用方法//1. 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效Monster monster01 = ioc.getBean("monster01", Monster.class);Monster monster02 = ioc.getBean("monster01", Monster.class);System.out.println("monster01--" + monster01 + " " + monster01.hashCode());System.out.println("monster02--" + monster02 + " " + monster02.hashCode());//=====演示 @Configuration(proxyBeanMethods = xxx) end===}
}

3.配置类可以有多个, 就和Spring可以有多个ioc配置文件一个道理
1)创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig2.java

@Configuration
public class BeanConfig2 {@Beanpublic Monster monster02() {return new Monster(300, "太上老君" , 1000 , "炼丹炉");}
}

2)完成测试MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====测试可以有多个配置类 start===//两个配置类注入的Bean都生效Monster monster02 = ioc.getBean("monster02", Monster.class);Monster monster01 = ioc.getBean("monster01", Monster.class);System.out.println("monster02--" + monster02);System.out.println("monster01--" + monster01);//=====测试可以有多个配置类 end===}
}

@Import

应用实例

说明: 演示在SpringBoot, 如何通过 @Import 来注入组件
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Cat.javaD:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Dog.java

public class Dog {}public class Cat {}

2.修改BeanConfig.java, 通过@Import注入组件

/*** 解读* 1.@Import 源码 可以看到, 我们可以指定 class的数组, 可以注入指定类型的Bean* public @interface Import {*     Class<?>[] value();* }* 2.通过@Import 方式注入了组件, 默认组件 名字/id 就是对应类型的全类名*/
@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {}

3.修改MainApp.java, 完成测试

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====测试@Import 使用 start===Dog dogBean = ioc.getBean(Dog.class);Cat catBean = ioc.getBean(Cat.class);System.out.println("dogBean---" + dogBean);System.out.println("catBean---" + catBean);//=====测试@Import 使用 end===}
}

@Conditional

@Conditional介绍

1.条件装配: 满足Conditional指定的条件, 则进行组件注入
在这里插入图片描述

2.@Conditional 是一个根注解, 下面有很多扩展注解

在这里插入图片描述

应用实例

1.要求: 演示在SpringBoot, 如何通过 @ConditionalOnBean 来注入组件
2.只有在容器中有 name=monster_nmw 组件时, 才注入 dog01.

@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {@Bean//@Bean(name = "monster_nmw")public Monster monster01() {return new Monster(200, "牛魔王", 500, "芭蕉扇");}@Beanpublic Dog dog01() {return new Dog();}
}

3.先测试下, 当前是否能注入 dog01

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====测试@ConditionalOnBean 使用 start===Dog dog01 = ioc.getBean("dog01", Dog.class);System.out.println("dog01---" + dog01);//=====测试@ConditionalOnBean 使用 end===}
}

4.修改BeanConfig.java, 加入@ConditionalBean条件约束, 并完成测试

@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {@Bean//@Bean(name = "monster_nmw")public Monster monster01() {return new Monster(200, "牛魔王", 500, "芭蕉扇");}@Bean(name = "monster_nmw")public Cat cat01() {return new Cat();}@Bean/*** 解读* 1.@ConditionalOnBean(name = "monster_nmw") 表示* 2.当容器中有一个Bean, 名字是monster_nmw(类型不做约束), 就注入dog01这个Dog bean* 3.如果没有 名字是 monster_nmw 的Bean, 就不注入dog01这个Dog bean.* 4.还有很多其它的条件约束注解, 小伙伴可以自己测试** 5.@ConditionalOnMissingBean(name = "monster_nmw") 表示在容器中* , 没有 名字/id 为 monster_nmw 的Bean, 才注入dog01这个Bean** 6.@Conditional根注解及其扩展注解, 也可以修饰类* @ConditionalOnBean(name = "monster_nmw")* public class BeanConfig {}* 表示对该配置类的所有要注入的组件, 都进行条件约束.*/@ConditionalOnBean(name = "monster_nmw")//@ConditionalOnMissingBean(name = "monster_nmw")public Dog dog01() {return new Dog();}
}

@ImportResource

作用: 原生配置文件引入, 也就是可以直接导入Spring 传统的beans.xml, 可以认为是SpringBoot 对 Spring 容器文件的兼容.

应用实例

1.需求: 将 beans.xml 导入到 BeanConfig.java 配置类, 并测试是否可以获得 beans.xml 注入/配置 的组件
在这里插入图片描述

2.修改BeanConfig.java 或者 创建新的BeanConfig3.java(建议创建新的配置类)来测试, 使用 @ImportResource 导入beans.xml,beans02.xml(复制beans.xml的配置,改改数据)

@Configuration
//导入beans.xml, 就可以获取到beans.xml 中配置的bean
@ImportResource(locations = {"classpath:beans.xml", "classpath:beans02.xml"})
public class BeanConfig3 {
}

3.修改MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示@ImportResource 使用 start===Monster monster = ioc.getBean("monster", Monster.class);System.out.println("monster---" + monster);System.out.println("monster bean 是否存在-" + ioc.containsBean("monster"));Monster monster03 = ioc.getBean("monster03", Monster.class);System.out.println("monster03---" + monster03);System.out.println("monster03 bean 是否存在-" + ioc.containsBean("monster03"));//=====演示@ImportResource 使用 end===}
}

配置绑定

一句话:使用Java读取到SpringBoot 核心配置文件 application.properties 的内容,并且把它封装到JavaBean中.

应用实例

1.需求: 将application.properties指定的 k-v 和 JavaBean 绑定

2.application.properties增加配置

#1.设置Furn的属性k-v
#2.前面的furn01 是用于指定/区分不同的绑定对象, 这样可以在绑定Furn bean属性值时
#, 通过furn01 前缀进行区分
#3.furn01.id 中的id 就是你要绑定的 Furn bean的属性名
furn01.id=100
furn01.name=phone
furn01.price=6000

3.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Furn.java

@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "furn01")
public class Furn {private Integer id;private String name;private BigDecimal price;
}

4.修改HiController, 完成自动装配

@Controller
public class HiController {//装配到HiController@Resourceprivate Furn furn;@RequestMapping("/furn")@ResponseBodypublic Furn furn() {return furn;}
}

5.启动SpringBoot 主程序, 完成测试
在这里插入图片描述

5.配置绑定还有第2种方式, 这里也演示一下, 效果一样.
注意: 注销 @Component 需要在 BeanConfig.java(说明: 也可以是其它配置类) 配置 @EnableConfigurationProperties(Furn.class), 否则会提示错误
在这里插入图片描述

/*** @EnableConfigurationProperties({Furn.class})解读* 1.开启Furn配置绑定功能* 2.把Furn组件自动 注册/注入 到容器中*/
@EnableConfigurationProperties({Furn.class})
public class BeanConfig {}

注意事项和细节

1.如果 application.properties 有中文, 需要转成 unicode 编码写入, 否则会出现乱码. 在线Unicode转中文
以前学SpringMVC创建国际化文件的时候遇到过

furn01.id=100
furn01.name=\u5bb6\u5c45
furn01.price=6000

2.使用 @ConfigurationProperties(prefix=“furn01”) 会提示以下信息, 但是不会影响使用
在这里插入图片描述

3.解决 @ConfigurationProperties(prefix=“furn01”) 提示信息, 在 pom.xml 增加依赖, 即可

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!--这里我们配置optional为true说明: 表示防止将此依赖传递到其它模块--><optional>true</optional>
</dependency>

在这里插入图片描述

接下来, 我们将学习 分布式微服务: springboot底层机制实现
在这里插入图片描述

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

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

相关文章

Microsoft Office免费下载安装

文章目录 前言一、下载Office Tool Plus二、部署步骤1.移除本机低版本office2.部署设置3.开始部署 前言 本人一直支持国产WPS&#xff08;因为正版Microsoft Office需要花钱&#xff09;。直到某天接触到一款免费部署Microsoft Office的软件——Office Tool Plus&#xff0c;简…

C++ //CCF-CSP计算机软件能力认证 202406-1 矩阵重塑(其一)

CCF-CSP计算机软件能力认证 202406-1 矩阵重塑&#xff08;其一&#xff09; 题目背景 矩阵&#xff08;二维&#xff09;的重塑&#xff08;reshape&#xff09;操作是指改变矩阵的行数和列数&#xff0c;同时保持矩阵中元素的总数不变。 题目描述 矩阵的重塑操作可以具体…

BEV端到端视觉论文合集|从不同的视角解析BEV感知技术

随着自动驾驶技术的不断发展&#xff0c;基于摄像头的感知系统已成为关键&#xff0c;而Bird’s Eye View (BEV)大模型在其中发挥着重要作用。BEV大模型是一种将摄像头捕捉到的2D图像转换为自上而下视角的3D感知的技术&#xff0c;使得车辆能够更好地理解周围环境。 BEV大模型…

高职人工智能专业实训课之“图像识别基础”

一、前言 随着人工智能技术的迅猛发展&#xff0c;高职院校对人工智能专业实训课程的需求日益迫切。唯众人工智能教学实训平台作为一所前沿的教育技术平台&#xff0c;致力于为学生提供高效、便捷的人工智能实训环境&#xff0c;特别在“图像识别基础”这一关键课程中&#xf…

ubuntu多版本cuda如何指定cuda版本

本文作者&#xff1a; slience_me ubuntu多版本cuda如何指定cuda版本 文章目录 ubuntu多版本cuda如何指定cuda版本1. 关于cuda设置1.1 查看当前安装的 CUDA 版本1.2 下载并安装所需的 CUDA 版本1.3 设置环境变量1.4 验证切换1.5 安装对应的 NVIDIA 驱动程序 2. 设置环境变量2.1…

【机器学习 复习】第5章 朴素贝叶斯分类器

一、概念 1.贝叶斯定理&#xff1a; &#xff08;1&#xff09;就是“某个特征”属于“某种东西”的概率&#xff0c;公式就是最下面那个公式。 2.朴素贝叶斯算法概述 &#xff08;1&#xff09;是为数不多的基于概率论的分类算法&#xff0c;即通过考虑特征概率来预测分类。 …

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具&#xff0c;该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接&#xff08;死链&#xff09;。所谓死链&#xff0c;即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话&#xff0c;…

【论文笔记】LoRA LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

题目&#xff1a;LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 来源: ICLR 2022 模型名称: LoRA 论文链接: https://arxiv.org/abs/2106.09685 项目链接: https://github.com/microsoft/LoRA 文章目录 摘要引言问题定义现有方法的问题方法将 LORA 应用于 Transformer 实…

深度学习:从理论到应用的全面解析

引言 深度学习作为人工智能&#xff08;AI&#xff09;的核心技术之一&#xff0c;在过去的十年中取得了显著的进展&#xff0c;并在许多领域中展示了其强大的应用潜力。本文将从理论基础出发&#xff0c;探讨深度学习的最新进展及其在各领域的应用&#xff0c;旨在为读者提供全…

5G与4G的区别

“4G改变生活&#xff0c;5G改变社会”&#xff0c;已经成为了通信行业的流行语。通信的变革日新月异&#xff0c;从以前的1G只能接听电话&#xff0c;到2G可以发送短信&#xff0c;时光飞逝&#xff0c;4G将智能带进了我们的生活&#xff0c;每一个“G”的进步&#xff0c;都极…

Java宝藏实验资源库(4)对象数组

一、实验目的 学习面向对象程序设计的方法。学习建立对象数组的方法。 学习在数组中存储和处理对象。 二、实验内容、过程及结果 **10.7 (Game: ATM machine) Use the Account class created in Programming Exer cise 9.7 to simulate an ATM machine. Create ten accou…

大数据存储技术笔记

目录 大数据的特性 HDFS 读流程的基本步骤 HDFS 写流程的基本步骤 Mapreduce的执行过程 MapReduce 中 combiner 作用 hadoop 调度器及其工作方法 Hive 中内部表与外部表区别(创建删除角度) Hadoop 的 2 个主要组件及其功能 Hadoop MapReduce 的工作流程 正常工作的 ha…

AWS Lambda + Flask 应用示例

前言 AWS Lambda 本身是一个以事件驱动的 Serverless 服务, 最简单的应用就是在入口函数中对接收到的事件/请求进行处理并返回响应. 对于像 Flask 这样的 Web 框架, 并不能直接在 Lambda 上提供服务, 不过我们可以借助 AWS Lambda Web Adapter 实现一个基于 Flask 框架的 Web …

IDEA、PyCharm等基于IntelliJ平台的IDE汉化方式

PyCharm 或者 IDEA 等编辑器是比较常用的&#xff0c;默认是英文界面&#xff0c;有些同学用着不方便&#xff0c;想要汉化版本的&#xff0c;但官方没有这个设置项&#xff0c;不过可以通过插件的方式进行设置。 方式1&#xff1a;插件安装 1、打开设置 File->Settings&a…

iptables(4)规则匹配条件

简介 前面我们已经介绍了iptables的基本原理,表、链,数据包处理流程。如何查询各种表的信息。还有基本的增、删、改、保存的基础操作。 经过前文介绍,我们已经能够熟练的管理规则了,但是我们只使用过一种匹配条件,就是将”源地址”作为匹配条件。那么这篇文章中,我们就来…

【Java】已解决java.net.MalformedURLException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.MalformedURLException异常 在Java的网络编程中&#xff0c;java.net.MalformedURLException是一个常见的异常&#xff0c;它通常表明URL&#xff08;统一资源定位符…

「五度易链」企业大数据API接口开放平台上线啦!

“五度易链”企业大数据API接口开放平台现已正式上线&#xff0c;旨在为广大企业、开发者及个人提供标准、安全、高效、便捷的企业数据API接口服务&#xff0c;帮您更轻松地构建应用、扩展功能&#xff0c;并基于用户应用场景提供专属接口定制服务&#xff0c;助力企业提升研发…

数据分析必备:一步步教你如何用matplotlib做数据可视化(8)

1、Matplotlib 条形图 条形图或条状图是一种图表或图形&#xff0c;它显示带有矩形条的分类数据&#xff0c;其高度或长度与它们所代表的值成比例。可以垂直或水平绘制条形。 条形图显示了离散类别之间的比较。图表的一个轴显示要比较的特定类别&#xff0c;另一个轴表示测量值…

Stable Diffusion WebUI 使用ControlNet:IP-Adapter保持生图的角色一致性

IP-Adapter-FaceID可以在保持人脸一致的条件下生成各种风格的图像。 下载 IP Adapter 需要的 Face ID 模型和 Lora 下载地址&#xff1a;https://huggingface.co/h94/IP-Adapter-FaceID/ 下载 ip-adapter-faceid-plusv2_sd15.bin 和 ip-adapter-faceid-plusv2_sd15_lora.saf…

【MySQL进阶之路 | 高级篇】常见索引(聚簇索引, 二级索引)

1. 常见索引概念 索引按照物理实现方式&#xff0c;可以分为两种&#xff0c;聚簇索引和非聚簇索引.我们也把非聚簇索引称为二级索引或辅助索引. (1). 聚簇索引 聚簇索引并不是一种单独的索引类型&#xff0c;而是一种数据存储方式(所有的数据记录都存储在了叶子节点)&#…