Skip to content

2. Service

gaowei edited this page Mar 22, 2022 · 7 revisions

ServiceLoader

典型应用场景

  • 在相互解耦的module间,跨module调用类方法

特点

  • 获取实例时可以指定任意构造器
  • 关于反射,当使用无参构造器时无反射,指定有参构造器使用到了反射
  • 可以通过alias过滤,还支持任意数量多维度对目标进行过滤
  • 支持单例
  • 支持返回的多个服务按优先级顺序排序

定义服务接口

// 根据业务自定义,需要下沉到两个module公共的代码里,需要双方都能引用到
public interface IOrderService {
    void sendOrder(...);
}

静态定义和注册

@Service(function = IOrderService.class,   //服务接口
         cache = Cache.SINGLETON           //可选,是否单例
         priority = 5)                     //可选,优先级
public class OrderService implements IOrderService {
    // 无参构造器
    public OrderService() {
    }
    // 有参构造器
    public OrderService(int type, String str) {
    }
    
    @Override
    public void sendOrder(...) {
    }
}

动态定义和注册

  • 在内部注册一个可被监听者
  • 如果注册时使用了lifecycleOwner,会自动解注册
// 动态注册
IRegister register = 
       DRouter.register(
              ServiceKey.build(IOrderService.class).setLifecycleOwner(lifecycleOwner), 
              orderService);
// 解注册,如果注册时使用了生命周期,则可省
register.unregister();

发起导航

// 获取class
Class<IOrderService> serviceCls = DRouter.build(IOrderService.class).getServiceClass();
// 调用无参构造器创建实例
IOrderService service = DRouter.build(IOrderService.class).getService();
List<IOrderService> service = DRouter.build(IOrderService.class).getAllService();
// 调用有参构造器创建实例
IOrderService service = DRouter.build(IOrderService.class).getService(3, "a");

服务过滤

简单别名过滤

  • 可以使用简单的alias别名过滤
// 定义
@Service(function = IOrderService.class,
         alias = "test")
public class OrderService implements IOrderService {
}

// 调用方
IOrderService service = DRouter.build(IOrderService.class).setAlias("test").getService();

多特征过滤

  • 定义过滤器Bean
  • 每个属性就是一个维度,可以定义多个维度,多个维度是“与”的关系
  • 必须每一个属性都能匹配上才可以
  • 属性的类型需要是基本类型、字符串
  • 使用@Assign注解来匹配属性
  • 设置值时,可以赋值为单个值或者为数组,同一个属性的多个值是“或”的关系
  • 同一个属性如果多个值,只要能匹配上任一个值就算匹配成功
  • 可以和alias同时使用
// 根据业务自定义特征,类名随意
// 属性个数随意,类型支持所有的基本类型、字符串
public class Feature {
    public int a;
    public short b;
    public String c;
}
// 定义过滤器
@Service(function = IOrderService.class,
         feature = Feature.class)
public class OrderService implements IOrderService {
    @Assign   // 变量名一致,匹配Filter中的成员a
    public static final int a = 1;
    @Assign   // 支持同一维度下多种场景,该维度下匹配,任意一个值即匹配成功
    public static final short[] b = {1, 2, 3};
    @Assign(name = "c")   // 可以显式指定匹配过滤器中的成员c
    public static final String xx = "q";

}
// 调用方
Feature feature = new Feature();
feature.a = 1;
feature.b = 2;
feature.c = "q";
IOrderService test1 = DRouter.build(IOrderService.class)
		.setFeature(feature)
		.getService();

AnyAbility

  • 希望遍历所有的父类或父接口,全部作为该Service可被查找的function接口
  • 调用方可以使用实现类的任意一个基类或者接口来获取实现类
@Service(function = AnyAbility.class)
public class OrderService implements IOrderService1, IOrderService2, IOrderService3 {
}

// 调用方
IOrderService2 service = DRouter.build(IOrderService2.class).getService();