java spi

java spi实现

当服务提供者(provider),提供一个接口多种实现时,

  1. 在jar包的META-INF/services/目录下创建该接口的全限名文件,文件里面的内容就是该服务接口的具体实现类的名称,而当外部加载这个 模块时,就能通过该jar包META-INF/services/里的配置文件得到具体实现类名,并加载实例化,完成模块的装配
spi工程目录
//Command.java
package com.soa.other.spi;

public interface Command {
    void execute();
}
//ShutdownCommand 
package com.soa.other.spi;

public class ShutdownCommand implements Command{
    @Override
    public void execute() {
        System.out.println("Shutdown");
    }
}
// StartCommand 
package com.soa.other.spi;

public class StartCommand implements Command {
    @Override
    public void execute() {
        System.out.println("Start");
    }
}

//Main调用类

package com.soa.other.spi;

import java.util.ServiceLoader;

public class Main {
    public static void main(String[] args) {
        ServiceLoader serviceLoader = ServiceLoader.load(Command.class);
        for (Command command : serviceLoader) {
            command.execute();
        }
    }
}

弊端(相比与dubbo的spi):
1.一次性加载
2.全部加载,没有用到也要会加载
3.没有AOP/IOC的支持

你可能感兴趣的:(java spi)