Skip to content

Commit f2eae06

Browse files
author
hollis.zhl
committed
添加序列化、SPI相关知识点
1 parent 01af04a commit f2eae06

File tree

9 files changed

+713
-4
lines changed

9 files changed

+713
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
.idea/**/common_info.xml
1313
.idea/**
1414

15+
1516
# Sensitive or high-churn files
1617
.idea/**/dataSources/
1718
.idea/**/dataSources.ids

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ apache集合处理工具类的使用、
171171

172172
#### 序列化
173173

174-
什么是序列化与反序列化、为什么序列化、序列化底层原理序列化与单例模式、protobuf、为什么说序列化并不安全
174+
[什么是序列化与反序列化](/basics/java-basic/serialize.md)、为什么序列化、[序列化底层原理](/basics/java-basic/serialize-principle.md)[序列化与单例模式](/basics/java-basic/serialize-singleton.md)、protobuf、为什么说序列化并不安全
175175

176176
#### 注解
177177

@@ -189,7 +189,7 @@ Spring常用注解
189189

190190
#### 泛型
191191

192-
泛型与继承、类型擦除、泛型中K T V E ? [object等的含义](/basics/java-basic/k-t-v-e.md)、泛型各种用法
192+
泛型与继承、类型擦除、[泛型中K T V E ? object等的含义](/basics/java-basic/k-t-v-e.md)、泛型各种用法
193193

194194
限定通配符和非限定通配符、上下界限定符extends 和 super
195195

@@ -211,9 +211,9 @@ junit、mock、mockito、内存数据库(h2)
211211

212212
#### API&SPI
213213

214-
API、API和SPI的关系和区别
214+
API、[API和SPI的关系和区别](/basics/java-basic/api-vs-spi.md)
215215

216-
如何定义SPISPI的实现原理
216+
[如何定义SPI](/basics/java-basic/create-spi.md)[SPI的实现原理](/basics/java-basic/spi-principle.md)
217217

218218
#### 异常
219219

basics/java-basic/api-vs-spi.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Java 中区分 API 和 SPI,通俗的讲:API 和 SPI 都是相对的概念,他们的差别只在语义上,API 直接被应用开发人员使用,SPI 被框架扩展人员使用
2+
3+
4+
API Application Programming Interface
5+
6+
大多数情况下,都是实现方来制定接口并完成对接口的不同实现,调用方仅仅依赖却无权选择不同实现。
7+
8+
SPI Service Provider Interface
9+
10+
而如果是调用方来制定接口,实现方来针对接口来实现不同的实现。调用方来选择自己需要的实现方。

basics/java-basic/create-spi.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
步骤1、定义一组接口 (假设是org.foo.demo.IShout),并写出接口的一个或多个实现,(假设是org.foo.demo.animal.Dog、org.foo.demo.animal.Cat)。
2+
3+
public interface IShout {
4+
void shout();
5+
}
6+
public class Cat implements IShout {
7+
@Override
8+
public void shout() {
9+
System.out.println("miao miao");
10+
}
11+
}
12+
public class Dog implements IShout {
13+
@Override
14+
public void shout() {
15+
System.out.println("wang wang");
16+
}
17+
}
18+
19+
步骤2、在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个以接口命名的文件 (org.foo.demo.IShout文件),内容是要应用的实现类(这里是org.foo.demo.animal.Dog和org.foo.demo.animal.Cat,每行一个类)。
20+
21+
org.foo.demo.animal.Dog
22+
org.foo.demo.animal.Cat
23+
24+
步骤3、使用 ServiceLoader 来加载配置文件中指定的实现。
25+
26+
public class SPIMain {
27+
public static void main(String[] args) {
28+
ServiceLoader<IShout> shouts = ServiceLoader.load(IShout.class);
29+
for (IShout s : shouts) {
30+
s.shout();
31+
}
32+
}
33+
}
34+
35+
代码输出:
36+
37+
wang wang
38+
miao miao

0 commit comments

Comments
 (0)