SPI実装プロジェクトのプラグイン可能なプロジェクトの追加コンポーネントの使用

        最近、プロジェクトはファイルコンテンツを保存する必要があり、顧客は製品のデフォルトのオブジェクトストレージを使用せず、製品はカスタマイズされたコードを製品に統合したくないため、プラグイン可能なプラグインとして設計する必要があります。 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

オリジナルになるのは簡単ではありません。役に立ったら、気に入って集めてください(#^。^#)

おすすめ

転載: blog.csdn.net/idto315/article/details/123065676