java ServiceLoader
一个加载接口实现的加载器。针对接口的不同实现,全部加载进jvm。这种实现必定有一个公共接口存在,是java 自身提供的第三方扩展实现,使服务暴露和服务实现解耦,典型的应用就是mysql数据库的的驱动实现。
- eg:公共接口=》animal 接口 实现类=》dog 实现类,cat 实现类。
公共接口
package com.test.ice;
/**
*
* 动物类接口
*
* @author zby
* @time 2021/4/23 16:28
* ****************************************
*/
public interface Animal {
/**
*
* @desc 动物叫
******************************************
*/
public void jiao();
}
狗的实现
package com.test.iceimpl;
import com.test.ice.Animal;
/**
*
* 狗的实现
*
* @author zby
* @time 2021/4/25 10:49
* ****************************************
*/
public class Dog implements Animal {
@Override
public void jiao() {
System.out.println("狗叫声");
}
}
猫的实现
package com.test.iceimpl;
import com.test.ice.Animal;
/**
*
* 猫的实现
*
* @author zby
* @time 2021/4/25 10:49
* ****************************************
*/
public class Cat implements Animal {
@Override
public void jiao() {
System.out.println("猫叫声");
}
}
最终加载接口实现进jvm
package com.test;
import com.test.ice.Animal;
import java.util.ServiceLoader;
/**
*
* serviceloader main
*
* @author zby
* @time 2021/4/25 10:52
* ****************************************
*/
public class TestServiceLoader {
public static void main(String[] argus){
ServiceLoader<Animal> serviceLoader = ServiceLoader.load(Animal.class);
for (Animal v : serviceLoader) {
v.jiao();
}
}
}
执行结果:
java ServiceLoader到现在就介绍完了,下面详细阐述dubbo 源码中ServiceLoader的使用。
dubbo在版本2.7.7之前都是使用硬编码的形式去发现META-INF/dubbo.internal文件夹下面的适配类。
version 2.7.6之前load实现类
version 2.7.7之后load实现类
// 定义加载策略
// 从resource下面加载出需要的位置
// uml图,Priortized实现接口比较排序
以上就是dubbo2.7.7 替换的serviceloader的使用.