-
Notifications
You must be signed in to change notification settings - Fork 93
2. Service
gaowei edited this page Mar 22, 2022
·
7 revisions
- 在相互解耦的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();
- 希望遍历所有的父类或父接口,全部作为该Service可被查找的function接口
- 调用方可以使用实现类的任意一个基类或者接口来获取实现类
@Service(function = AnyAbility.class)
public class OrderService implements IOrderService1, IOrderService2, IOrderService3 {
}
// 调用方
IOrderService2 service = DRouter.build(IOrderService2.class).getService();