# 模块开发
我之所以叫做 Model 而不是 Module,是因为模块本身不具有应用代码,甚至不具有完整的功能实现,而是功能的 API。
具体功能的实现,应该由运行时实现。
才能让某个模组的 YuQ 应用,具有跨运行时的能力。
# 开发
# 自定义注解类扫描
# 定义注解
YuQ 提供了一种非常方便的方法,供您获得被标记了您特定注解的类。
以 YuQ-QQ 为例:
@LoadBy(QQControllerLoader.class)
public @interface PrivateController {
String value() default "";
}
1
2
3
4
2
3
4
只需要将注解标记一个 com.IceCreamQAQ.YuQ.annotation.LoadBy
注解,并将 Loader 指向您的加载器,就可以非常方便的获得所有标记了您特定注解的类。
# 编写加载器
您需要编写一个类,并实现 com.IceCreamQAQ.YuQ.loader.Loader
接口。
在应用初始化的时候,如有存在的指向加载器的注解,则加载器会被实例化,并调用相关方法。
void load(List<LoadItem> items) throws Exception;
1
方法允许抛出任何异常,但方法一旦抛出异常,应用加载过程就会被终止。
@Data
public class LoadItem {
private Annotation annotation;
private Class<?> type;
private Object instance;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
这个对象承载了所有的加载信息。
annotation 内存储了类标记的特定注解。
type 内存储了类的 Class 对象。
instance 内存储了类的实例。
您可以在方法内进行该有的加载及初始化操作。
# 为运行时提供接口
如果您的模块提供运行时,如 YuQ-Web,那则无需关注这个。
如果您的模块不提供运行时,或者可以跨多个运行时运行,如 YuQ-QQ,则您应该将模块需要运行时实现的功能做成接口,然后单独实现运行时。