[Java]重学Java-ServiceLoader简单实践

接口与实现进行解耦

我们现在要实现这样一件事儿,在工程包下定义一个接口,然后通过插件来决定实现类(类似于JDBC中的oracle和mysql),我们这里用到的是ServiceLoader.

定义一个接口

  • ICipher
package com.tea.modules.java8.spi;

/**
 * com.tea.modules.java8.spi
 * 定义一个加密服务
 * @author jaymin
 * @since 2022/4/13
 */
public interface ICipher {
    /**
     * 加密
     * @param source
     * @param key
     * @return
     */
    byte[] encrypt(byte[] source,byte[] key);
}

定义实现类

  • CaesarCipher
package com.tea.modules.java8.spi;

/**
 * com.tea.modules.java8.spi
 *
 * @author jaymin
 * @since 2022/4/13
 */
public class CaesarCipher implements ICipher{
    @Override
    public byte[] encrypt(byte[] source, byte[] key) {
        System.err.println("我是SPI1");
        return new byte[0];
    }
}
  • MyCipher
package com.tea.modules.java8.spi;

/**
 * com.tea.modules.java8.spi
 *
 * @author jaymin
 * @since 2022/4/13
 */
public class MyCipher implements ICipher{
    @Override
    public byte[] encrypt(byte[] source, byte[] key) {
        System.err.println("我是SPI2");
        return new byte[0];
    }
}

创建META-INF并放入配置文件

meta-inf

注意,这里文件命名要以接口的全路径名进行命名,然后内容是你希望的实现类路径.

使用ServiceLoader

package com.tea.modules.java8.spi;

import java.util.ServiceLoader;

/**
 * com.tea.modules.java8.spi
 *
 * @author jaymin
 * @since 2022/4/13
 */
public class SPIDemo {
    public static void main(String[] args) {
        ServiceLoader ciphers = ServiceLoader.load(ICipher.class);
        ciphers.forEach(iCipher -> {
            iCipher.encrypt(null,null);
        });
    }
}
spi

使用这种方式,可以进行快速的可插拔式插件加载

jdbc是怎么做的

jdbc

可以看到,异曲同工之妙.

你可能感兴趣的:([Java]重学Java-ServiceLoader简单实践)