最近、プロジェクトはファイルコンテンツを保存する必要があり、顧客は製品のデフォルトのオブジェクトストレージを使用せず、製品はカスタマイズされたコードを製品に統合したくないため、プラグイン可能なプラグインとして設計する必要があります。 SPIおよびSpringBootStarterとの最初の接触。この2つは非常に似ており、異なります。これがSPI実装の要約です。以下は完全な例です。
インターネット上の多くのブログでは、1つのプロジェクトにすべてのコードが含まれているため、理解して使用するのは不便です。ここでは、実際の使用シナリオに応じて3つのプロジェクトに分割されています。例では、3つのjarが必要です。インターフェースのjar、プラグインです。 jar、およびビジネスjar;記事の最後にあるソースコードのリンク。
IDEAプロジェクトは次のとおりです。
1.インターフェイスjarを記述します-他の2つのjarで使用します
pom座標
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.idto.spi</groupId>
<artifactId>idto-spi-api</artifactId>
<version>1.0</version>
<description>SPI-接口层jar包</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
</dependencies>
</project>
インターフェイスクラスを定義するSay
package com.idto.spi;
/**
* @author idto
* @title: Say
* @projectName
* @description: SPI定义的接口 需要业务层和实现的插件引用
* @date 2022/2/22 10:40
*/
public interface Say {
void sayWithLanguage(String language);
}
idto-spi-api.jarをコンパイルしてローカルウェアハウスにパッケージ化し、後で使用します。
2.SPIプラグインを作成します-プラグインjar
pom座標、ステップ1で作成したidto-spi-api.jarパッケージをインポートします
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.org.bjca</groupId>
<artifactId>idto-spi-plug</artifactId>
<version>1.0</version>
<description>SPI-插件jar包</description>
<dependencies>
<!--引入定义的接口-->
<dependency>
<groupId>com.idto.spi</groupId>
<artifactId>idto-spi-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
インターフェイスの実装クラスを記述します。たとえば、2つの実装クラスがここに記述されます。
package com.idto.spi.impl;
import com.idto.spi.Say;
public class America implements Say {
@Override
public void sayWithLanguage(String s) {
System.out.println("Speak English -->"+s);
}
}
package com.idto.spi.impl;
import com.idto.spi.Say;
public class China implements Say {
@Override
public void sayWithLanguage(String s) {
System.out.println("中文说-->"+s);
}
}
集中
リソースの下に新しいMETA-INF.servicesを作成してから、services。com.idto.spi.Sayの下に新しいファイルcom.idto.spi.Say(インターフェイスのフルパス)を作成します。ファイルで使用されます。パス、複数の実装クラスが行に書き込まれます
idto-spi-plug.jarをコンパイルしてローカルウェアハウスにパッケージ化し、後で使用します。
SPIの実装が完了したので、その使用方法を見てみましょう。
3.ビジネスコードを書く-ビジネスジャー
pom座標、ステップ1で作成したidto-spi-api.jarパッケージをインポートします
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.org.bjca</groupId>
<artifactId>idto-spi-business</artifactId>
<version>1.0</version>
<description>SPI-业务jar包</description>
<dependencies>
<!--引入定义的接口-->
<dependency>
<groupId>com.idto.spi</groupId>
<artifactId>idto-spi-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resource</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 设置主类 -->
<mainClass>com.idto.spi.Main</mainClass>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<!-- 打包时过滤无用的文件,不打包进jar -->
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
<filter>
<artifact>junit:junit</artifact>
<includes>
<include>junit/framework/**</include>
<include>org/junit/**</include>
</includes>
<excludes>
<exclude>org/junit/experimental/**</exclude>
<exclude>org/junit/runners/**</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
SPIの呼び出しメソッドを記述し、javaに付属のServiceLoaderを介してプラグインをロードします。プラグインのディレクトリをコードで指定します。プラグインの名前はプラグインの名前です。プラグインは、参照用のコードでのみ記述されています。
package com.idto.spi;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ServiceLoader;
/**
* @author idto
* @title: Main
* @projectName idto-spi-business
* @description: SPI调用例子
* @date 2022/2/22 13:02
*/
public class Main {
public static void main(String[] args) throws MalformedURLException {
// 获取插件的路径
String projectPath = System.getProperty("user.dir");
Path path = Paths.get(projectPath);
String plugPath = path.toString() + File.separator + "plugs";
String location = plugPath + File.separator + "idto-spi-plug-1.0.jar";
System.out.println("plug Path is -->" + location);
System.out.println( );
System.out.println( );
System.out.println("---start---");
URL url = new File(location).toURI().toURL();
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}, ClassLoader.getSystemClassLoader());
ServiceLoader<Say> says = ServiceLoader.load(Say.class, urlClassLoader);
for (Say say : says) {
say.sayWithLanguage("Hello World!");
}
System.out.println("---end---");
}
}
この時点で、コードで直接テストできます。
実際の使用シナリオをシミュレートするために、パッケージ化してコンパイルし、入力したidto-spi-business-1.0.jarをテスト用のテストディレクトリにコピーします。
テストシナリオ1:プラグインなし
対応する実装クラスが見つからず、印刷が空です
テストシナリオ1:指定されたディレクトリに従ってプラグインを配置します
idto-spi-plug-1.0.jarをD:\ log\plugsの下に置きます
ビジネスクラスコードを実行すると、次のように2つの実装クラスのメソッドが正常に実行されます。
ソースコードアドレス:https ://gitee.com/idtolerate/idto-spi-demo
オリジナルになるのは簡単ではありません。役に立ったら、気に入って集めてください(#^。^#)