Android-使用@AutoService实现spi

什么是SPI?

Java SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制.

具体解释就是:

定义一个接口文件

写出多个该接口文件的实现

在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个以接口命名的文件 , 内容是要接口的实现类全路径

使用ServiceLoader类 来获取到这些实现的接口

示例

定义一个接口文件 - Book

package com.github.jokar.spi_test;

public interface Book {

String name();

}

实现两个接口

package com.github.jokar.spi_test;

public class Android implements Book {

@Override

public String name() {

return "Android";

}

}

package com.github.jokar.spi_test;

public class Ios implements Book {

@Override

public String name() {

return "iOS";

}

}

在resources目录下建立/META-INF/services目录,并建立已com.github.jokar.spi_test.Book为命名的文件,然后把Android和Ios全路径添加进去

使用ServiceLoader类读取Book接口实现类

ServiceLoader load = ServiceLoader.load(Book.class);

for (Book book : load) {

System.out.println(book.name());

}

但是使用起来却很不方便,最麻烦的就是要到/META-INF/services目录建立文件,不能动态添加。外汇常见问题所以我们用到了Google的@AutoService,他可以帮我们在编译的时候动态去生成这些东西,这样开发中就不用做太多其他复杂操作。

@AutoService 引入(Koltin)

apply plugin: 'kotlin-kapt'

1

kapt 'com.google.auto.service:auto-service:1.0-rc6'

api 'com.google.auto.service:auto-service:1.0-rc6'

@AutoService 举例

创建一个接口文件

interface Book {

fun name() :String

}

创建两个继承

Android-Book

@AutoService(Book::class)

class Android :Book {

override fun name():String {

return "Android"

}

}

iOS-Book

@AutoService(Book::class)

class IOS :Book {

override fun name(): String {

return "ios"

}

}

获取继承类

private fun getBookList() {

val bookList = ServiceLoader.load(Book::class.java, javaClass.classLoader).toList()

bookList.forEach {

Log.d("MainActivity", it.name())

}

}

猜你喜欢

转载自www.cnblogs.com/benming/p/12468243.html