Spring IoC及DI依赖注入

Spring

1.Spring的含义:

Spring 可从狭义与广义两个角度看待

狭义的 Spring 是指 Spring 框架(Spring Fremework)

广义的 Spring 是指 Spring 生态体系

2.狭义的 Spring 框架

Spring 框架是企业开发复杂性的一站式解决方案

Spring 框架的核心是 IoC 容器和 AOP 面向切面编程

Spring Ioc 负责创建与管理系统对象,并在此基础上扩展功能

3.广义的 Spring 生态系统

4.Spring IoC 容器

4.1 IoC 控制反转:

(1)IoC 控制反转,全称是 Inverse of Control,是一种设计理念

(2)由代理人来创建与管理对象,消费者通过代理人来获取对象

(3)IoC 的目的是降低对象间的直接耦合

加入 IoC 容器将对象统一管理,让对象关联变为弱耦合

4.2 Ioc 容器是Spring生态的地基,用于统一创建和管理对象的依赖

4.3 Spring IoC 容器职责

(1)对象的控制权交由第三方统一管理(IoC控制反转)

(2)利用反射技术实现运行时对象创建与关联(DI依赖注入)

(3)基于配置提高应用程序的可维护性与扩展性

4.4 DI依赖注入

(1)IoC 是设计理念,是现代程序设计遵循的标准,是宏观目标

(2)DI (Dependency Injection) 是具体技术实现,是微观实现

(3)DI 在java中利用反射技术实现对象注入(Injection)

4.4.1 什么是对象依赖注入

依赖注入是指运行时将容器内对象利用反射赋给其他对象的操作

(1)基于Setter方法注入对象

<bean id="sweetApple" class="com.mkyuan.ioc.entity.Apple"><!--IoC 容器自动利用反射机制运行时调用setXXX方法为属性赋值--><property name="title" value="红富士"></property><property name="color" value="红色"></property><property name="origin" value="欧洲"></property></bean><bean id="lily" class="com.mkyuan.ioc.entity.Child"><property name="name" value="莉莉"></property><property name="apple" ref="sweetApple"></property></bean>

案例:

BookDao 类

public interface BookDao {public void insert();
}

BookDaoImpl 类

public class BookDaoImpl implements BookDao{@Overridepublic void insert() {System.out.println("向 MySQL Book 表插入一条数据");}
}

BookDaoOracleImpl 类

public class BookDaoOracleImpl implements BookDao{@Overridepublic void insert() {System.out.println("向 Oracle Book 表插入一条数据");}
}

BookService 类

public class BookService {private BookDao bookDao;public BookDao getBookDao() {return bookDao;}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}public void purchase(){System.out.println("正在执行图书采购业务方法");bookDao.insert();}
}

applicationContext-dao.xml

<bean id="bookDao" class="com.mkyuan.ioc.bookshop.dao.BookDaoOracleImpl"></bean>

可通过选择Dao接口下不同的实现类注入对象

applicationContext-service.xml

  <bean id="bookService" class="com.mkyuan.ioc.bookshop.service.BookService"><property name="bookDao" ref="bookDao"></property></bean>

BookShopApplication 类

public class BookShopApplication {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-*.xml");BookService bookService = context.getBean("bookService", BookService.class);bookService.purchase();}
}

(2)基于构造方法注入对象

<bean id="sweetApple" class="com.mkyuan.ioc.entity.Apple"><property name="title" value="红富士"></property><property name="origin" value="欧洲"></property><property name="color" value="红色"></property></bean><bean id="lily" class="com.mkyuan.ioc.entity.Child"><property name="name" value="莉莉"></property><property name="apple" ref="sweetApple"></property></bean>

4.4.2 注入集合对象

Company 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Company {private Set<String> rooms;private Map<String, Computer> computers;private Properties info;
}

Computer 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Computer {private String brand;private String type;private String sn;private Float price;
}

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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="c1" class="com.mkyuan.ioc.entity.Computer"><constructor-arg name="brand" value="联想"></constructor-arg><constructor-arg name="type" value="台式机"></constructor-arg><constructor-arg name="sn" value="8389283012"></constructor-arg><constructor-arg name="price" value="3085"></constructor-arg></bean><bean id="company" class="com.mkyuan.ioc.entity.Company"><property name="rooms"><set><value>2001-总裁办</value><value>2003-总经理办公室</value><value>2010-研发部会议室</value><value>2010-研发部会议室</value></set></property><property name="computers"><map><entry key="dev-88172" value-ref="c1"></entry><entry key="dev-88173"><bean class="com.mkyuan.ioc.entity.Computer"><constructor-arg name="brand" value="联想"></constructor-arg><constructor-arg name="type" value="笔记本"></constructor-arg><constructor-arg name="sn" value="8389283012"></constructor-arg><constructor-arg name="price" value="5060"></constructor-arg></bean></entry></map></property><property name="info"><props><prop key="phone">010-12345678</prop><prop key="address">深圳市xxx路xx大厦</prop><prop key="website">http://www.xxxx.com</prop></props></property></bean>
</beans>

SpringApplication 类

public class SpringApplication {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Company company = context.getBean("company", Company.class);String website = company.getInfo().getProperty("website");System.out.println(website);System.out.println(company);}
}

4.4.3 查看容器内对象

SpringApplication

public class SpringApplication {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Company company = context.getBean("company", Company.class);String website = company.getInfo().getProperty("website");System.out.println(website);System.out.println(company);System.out.println("========================");//获取容器内所有BeanId数组String[] beanNames = context.getBeanDefinitionNames();for (String beanName : beanNames) {System.out.println(beanName);System.out.println("类型:"+context.getBean(beanName).getClass().getName());System.out.println("内容:"+context.getBean(beanName));}}
}

5.Spring Ioc 初体验

5.1.案例:

(1)妈妈在早餐后给三个孩子分发餐后水果

(2)盘子里装有三个水果:红富士/青苹果/金帅

(3)孩子们口味不同:莉莉喜欢甜的/安迪喜欢酸的/露娜喜欢软的

如何让孩子得到喜欢的苹果

5.1.1 普通方式

Apple 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Apple {private String title;private String color;private String origin;
}

Child 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Child {private String name;private Apple apple;public void eat() {System.out.println(name + "吃到了" + apple.getOrigin() + "种植的" + apple.getTitle());}
}

Application 类

public class Application {public static void main(String[] args) {Apple apple1 = new Apple("红富士", "红色", "欧洲");Apple apple2 = new Apple("青苹果", "绿色", "中亚");Apple apple3 = new Apple("金帅", "黄色", "中国");Child lily = new Child("莉莉", apple1);Child andy = new Child("安迪", apple2);Child luna = new Child("露娜", apple3);lily.eat();andy.eat();luna.eat();}
}

5.1.2 IoC 方式

引入依赖

   <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.9.RELEASE</version></dependency>

创建 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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="sweetApple" class="com.mkyuan.ioc.entity.Apple"><property name="title" value="红富士"></property><property name="origin" value="欧洲"></property><property name="color" value="红色"></property></bean><bean id="sourApple" class="com.mkyuan.ioc.entity.Apple"><property name="title" value="青苹果"></property><property name="origin" value="中亚"></property><property name="color" value="绿色"></property></bean><bean id="softApple" class="com.mkyuan.ioc.entity.Apple"><property name="title" value="金帅"></property><property name="origin" value="中国"></property><property name="color" value="黄色"></property></bean><bean id="lily" class="com.mkyuan.ioc.entity.Child"><property name="name" value="莉莉"></property><property name="apple" ref="sweetApple"></property></bean><bean id="andy" class="com.mkyuan.ioc.entity.Child"><property name="name" value="安迪"></property><property name="apple" ref="sourApple"></property></bean><bean id="luna" class="com.mkyuan.ioc.entity.Child"><property name="name" value="露娜"></property><property name="apple" ref="softApple"></property></bean></beans>

SpringApplication 类

public class SpringApplication {//创建 spring IoC 容器,并且根据配置文件在容器中实例化对象ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");Apple sweetApple = context.getBean("sweetApple", Apple.class);System.out.println(sweetApple);Child lily = context.getBean("lily", Child.class);lily.eat();Child andy = context.getBean("andy", Child.class);andy.eat();Child luna = context.getBean("luna", Child.class);luna.eat();
}

6.Bean 的配置方式

6.1 基于 XML 配置 bean

(1)基于构造方法实例化对象

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean标签默认通过默认构造方法创建对象--><bean id="apple1" class="com.mkyuan.ioc.entity.Apple"></bean><!--bean标签通过带参构造方法创建对象--><bean id="apple2" class="com.mkyuan.ioc.entity.Apple"><constructor-arg name="title" value="红富士"></constructor-arg><constructor-arg name="color" value="红色"></constructor-arg><constructor-arg name="origin" value="欧洲"></constructor-arg><constructor-arg name="price" value="19.8"></constructor-arg></bean><bean id="apple3" class="com.mkyuan.ioc.entity.Apple"><constructor-arg index="0" value="红富士"></constructor-arg><constructor-arg index="1" value="红色"></constructor-arg><constructor-arg index="2" value="欧洲"></constructor-arg><constructor-arg index="3" value="19.8"></constructor-arg></bean>
</beans>

(2)基于静态工厂实例化对象

AppleStaticFactory 类

/*** 静态工厂通过静态方法创建对象,隐藏创建对象的细节*/
public class AppleStaticFactory {public static Apple createSweetApple() {Apple apple = new Apple();apple.setTitle("红富士");apple.setOrigin("欧洲");apple.setColor("红色");return apple;}
}
 <!--利用静态工厂获取对象--><bean id="apple4" class="com.mkyuan.ioc.factory.AppleStaticFactory" factory-method="createSweetApple"></bean>

(3)基于工厂实例方法实例化对象

AppleFactoryInstance 类

/*** 工厂实例方法创建对象是指 Ioc 容器对工厂进行实例化并调用对应的实例方法创建对象的过程*/
public class AppleFactoryInstance {public Apple createSweetApple() {Apple apple = new Apple();apple.setTitle("红富士");apple.setOrigin("欧洲");apple.setColor("红色");return apple;}
}
 <!--利用工厂实例方法获取对象--><bean id="factoryInstance" class="com.mkyuan.ioc.factory.AppleFactoryInstance"></bean><bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"></bean>

6.1.1 id和name属性相同点

(1)bean id与 name 都是设置对象在 IoC 容器中唯一标示

(2)两者在同一个配置文件中都不允许出现重复

(3)两者允许在多个配置文件中出现重复对象,新对象覆盖旧对象

6.1.2 id和name属性区别

(1)id 更为严格,一次只能定义一个对象标示(推荐)

(2)name 更为宽松,一次允许定义多个对象标示

 <bean name="apple2,apple7" class="com.mkyuan.ioc.entity.Apple"><constructor-arg name="title" value="红富士2号"></constructor-arg><constructor-arg name="color" value="红色"></constructor-arg><constructor-arg name="origin" value="欧洲"></constructor-arg><constructor-arg name="price" value="29.8"></constructor-arg></bean>

(3)id 与 name 的命名要求有意义,按照驼峰命名书写

(4) 没有id和name默认使用类名全称作为bean标示

 <bean  class="com.mkyuan.ioc.entity.Apple"><constructor-arg name="title" value="红富士3号"></constructor-arg><constructor-arg name="color" value="红色"></constructor-arg><constructor-arg name="origin" value="欧洲"></constructor-arg><constructor-arg name="price" value="29.8"></constructor-arg></bean>
Apple apple2 = context.getBean("com.mkyuan.ioc.entity.Apple", Apple.class);
System.out.println(apple2);

6.2 基于注解配置 bean

6.2.1 基于注解的优势

(1)摆脱繁琐的XML形式的bean与依赖注入的配置

(2)基于"声明式"的原则,更适合轻量级的现代企业的应用

(3)让代码的可读性变的更好,研发人员拥有更好的开发体验

6.2.2 三类注解

(1)组件类型注解-声明当前类的功能与职责

(2)自动装配注解-根据属性特征自动注入对象

(3)元数据注解-更细化的辅助 IoC 容器管理对象的注解

6.2.3 四种组件类型注解

6.2.4 两种自动装配注解

6.3 基于 java 代码配置 bean

Config 类

@Configuration
@ComponentScan(basePackages = "com.mkyuan")
public class Config {@Beanpublic UserDao userDao() {UserDao userDao = new UserDao();System.out.println("已创建:" + userDao);return userDao;}@Bean@Primarypublic UserDao userDao1() {UserDao userDao = new UserDao();System.out.println("已创建:" + userDao);return userDao;}@Beanpublic UserService userService(UserDao userDao, EmployeeDao employeeDao) {UserService userService = new UserService();System.out.println("已创建:" + userService);userService.setUserDao(userDao);System.out.println("调用setUserDao:" + userDao);userService.setEmployeeDao(employeeDao);System.out.println("调用setEmployeeDao:" + employeeDao);return userService;}@Bean@Scope("prototype")public UserController userController(UserService userService) {UserController userController = new UserController();System.out.println("已创建:" + userController);userController.setUserService(userService);System.out.println("调用setUserService:" + userService);return userController;}
}

7.bean scope 属性

7.1 bean scope属性

bean scope属性用于决定对象何时被创建与作用范围

bean scope 配置将影响容器内对象的数量

bean scope 默认值singleton(单例),指全局共享一个对象实例,默认情况下bean会在 Ioc 容器创建后自动实例化,全局唯一

7.2 singleton与 prototype 对比

8.bean 的生命周期

Order 类

public class Order {private Float price;private Integer quantity;private Float total;public Order() {System.out.println("创建Order对象," + this);}public void init() {System.out.println("执行init方法");total = price * quantity;}public void destroy() {System.out.println("释放与订单对象相关的资源");}public void pay() {System.out.println("订单金额为:" + total);}public Float getPrice() {return price;}public void setPrice(Float price) {System.out.println("设置price:" + price);this.price = price;}public Integer getQuantity() {return quantity;}public void setQuantity(Integer quantity) {System.out.println("设置quantity:" + quantity);this.quantity = quantity;}public Float getTotal() {return total;}public void setTotal(Float total) {this.total = total;}
}

applicationContext.xml

<bean id="order1" class="com.mkyuan.ioc.entity.Order" init-method="init" destroy-method="destroy"><property name="price" value="19.8"></property><property name="quantity" value="20"></property>
</bean>

SpringApplication 类

public class SpringApplication {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");System.out.println("==========IoC容器已初始化=============");Order order1 = context.getBean("order1", Order.class);order1.pay();((ClassPathXmlApplicationContext) context).registerShutdownHook();}
}

执行结果

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

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

相关文章

LayUi之选项卡的详解(附源码讲解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.选项卡是什么 二.选项卡在什么时候使用…

java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

【云原生】· 一文了解docker中的网络

目录 &#x1f352;查看docker网络 &#x1f352;bridge网络 &#x1f352;none网络 &#x1f352;host网络 &#x1f352;自定义容器网络 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;云原生专栏 根据前面的学习&#xff0c;已经对d…

Qt/C++原创项目作品精选(祖传原创/性能凶残)

00 前言说明 从事Qt开发十年有余&#xff0c;一开始是做C#.NET开发的&#xff0c;因为项目需要&#xff0c;转行做嵌入式linux开发&#xff0c;在嵌入式linux上做可视化界面开发一般首选Qt&#xff0c;当然现在可选的方案很多比如安卓&#xff0c;但是十多年前那时候板子性能低…

服务器反向代理

反向代理作用 隐藏服务器信息 -> 保证内网的安全&#xff0c;通常将反向代理作为公网访问地址&#xff0c;web服务器是内网&#xff0c;即通过nginx配置外网访问web服务器内网 举例 百度的网址是&#xff1a;http://www.baidu.com &#xff0c; 现在我通过自己的服务器地…

unity 调用C++ dll 有类和指针操作

这个在之前unity 调用C dll 操作升级套娃函数调用_天人合一peng的博客-CSDN博客的基础上&#xff0c;但实事时类相互嵌套&#xff0c;非常不好处理。 1 测试直接将main()生成dll程序能运行不。 发现是可以的。 2 那就是想方法把对象或指针的操作的下一级函数直接写到main里面&…

STM32基础知识点总结

一、基础知识点 1、课程体系介绍 单片机概述arm体系结构STM32开发环境搭建 STM32-GPIO编程-点亮世界的那盏灯 STM32-USART串口应用SPI液晶屏 STM32-中断系统 STM32-时钟系统 STM32-ADC DMA 温湿度传感器-DHT11 2.如何学习单片机课程 多听理论、多理解、有问题及时提问 自己多…

ChatGPT助力校招----面试问题分享(十一)

1 ChatGPT每日一题&#xff1a;PCB布线&#xff0c;高速信号线走直角的后果 问题&#xff1a;PCB布线&#xff0c;高速信号线走直角的后果 ChatGPT&#xff1a;对于高速信号线来说&#xff0c;最好避免使用直角布线。直角布线会引入反射和信号损耗&#xff0c;从而导致信号完…

【Python】selenium项目实战:从12306网站获取特定时间段二等座有票的车次

文章目录 一、项目背景二、页面查找1、查询条件2、定位有二等座的元素3、定位有二等座的车次信息4、CtrlF检验xpath查找的车次 三、代码实现 一、项目背景 工具&#xff1a; pythonpycharmselenium 12306网址&#xff1a; https://kyfw.12306.cn/otn/leftTicket/init?linktyp…

【云原生】Docker跨主机网络Overlay与Macvlan的区别

跨主机网络通信解决方案 docker原生的overlay和macvlan 第三方的flannel&#xff0c;weave&#xff0c;calico 1.overlay网络 在Docker中&#xff0c;Overlay网络是一种容器网络驱动程序&#xff0c;它允许在多个Docker主机上创建一个虚拟网络&#xff0c;使得容器可以通过这…

氢辉能源|[4GW]质子交换膜产线投产发布会暨[3MW]PEM电解槽正式交付

2023年7月12日下午&#xff0c;氢辉能源&#xff08;深圳&#xff09;有限公司&#xff08;以下简称氢辉能源&#xff09;质子交换膜产线投产发布会暨12台50标方3MW电解槽交付仪式在深圳市龙岗区国际低碳城成功举办。 此外&#xff0c;氢辉能源与远景能源、润世华集团、宏洲新能…

【MySQL】MySQL里程碑

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️MySQL】 文章目录 时间表从产品特性的角度梳理其发展过程中了解MySQL里程碑事件 时间表 从产品特性的角度梳理其发展过程中了解MySQL里程碑事件 1995年&#xff0c;MySQL 1.0发布&#xff0c;仅供内…

MongoDB负载均衡集群监控

对负载均衡的集群监控&#xff0c;不仅仅集中在对集群所有的资源、服务等进行监控&#xff0c;还要兼顾整体逻辑。以MongoDB高可用负载均衡集群为例&#xff0c;对逻辑层面的监控&#xff0c;就是模拟用户行为&#xff0c;访问集群数据&#xff0c;判断运行状态是否正常。 Mong…

opencv 图像基础处理_灰度图像

opencv 学习2_灰度图像 二值图像表示起来简单方便&#xff0c;但是因为其仅有黑白两种颜色&#xff0c;所表示的图像不够细腻。如果想要表现更多的细节&#xff0c;就需要使用更多的颜色。例如&#xff0c;图 2-3 中的 lena 图像是一幅灰度图像&#xff0c; 它采用了更多的数值…

简单线性回归评估指标+R Squared

使得每一个数据集尽可能的小 均方误差MSE&#xff1a;&#xff08;平方和取平均值&#xff09; 均方根误差RMSE&#xff1a;&#xff08;平方和取平均值开根号&#xff09;&#xff1a;平均误差值 平均绝对误差MAE&#xff1a;&#xff08;绝对值取平均&#xff09;&#xff1a…

Vue3通透教程【十八】TS为组件的props标注类型

文章目录 &#x1f31f; 写在前面&#x1f31f; 回顾defineProps的基础写法&#x1f31f; defineProps的TS写法&#x1f31f; withDefaults方法&#x1f31f; 拓展&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 …

内网安全:内网穿透详解

目录 内网穿透技术 内网穿透原理 实验环境 内网穿透项目 内网穿透&#xff1a;Ngrok 配置服务端 客户端配置 客户端生成后门&#xff0c;等待目标上线 内网穿透&#xff1a;Frp 客户端服务端建立连接 MSF生成后门&#xff0c;等待上线 内网穿透&#xff1a;Nps 服…

【Linux】- Linux 磁盘分区、挂载

Linux 磁盘分区、挂载 1.1 Linux 分区1.2 硬盘说明1.3 磁盘情况查询 1.1 Linux 分区 原理介绍 Linux 来说无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系…

Mac搭建安卓模拟器(支持M1/M2)

引言 最近在研究Vue打包成app&#xff0c;给我的报价器搞一个移动端&#xff0c;奈何没有安卓手机用于测试。所以想到安装一个安卓模拟器。 看了下目前主流的安卓模拟器基本都不支持Mac版本。网易的mumu目前来看还是只支持Intel芯。 1. 简单版&#xff08;仅M系&#xff09;…

BigTable:一个针对结构化数据的分布式存储系统----论文摘要

目录 摘要 1. 介绍 2. 数据模型 行 列族 时间戳 3. API 4. 所需构件 5. 实现 5.1 Tablet的位置 5.2 Tablet分配 5.3 Tablet服务 5.4 压实&#xff08;Compactions&#xff09; 6. 优化 本地化分组 压缩(compression) 通过缓存提高读操作的性能 Bloom过滤器 C…