Glue,以事件驱动的方式编写代码, 并简化调用过程。
将过程式代码改造为 事件驱动代码有以下好处
- 针对业务逻辑变化,AService,BService,CService对外接口可能会经常改变。而抽象为事件后,事件变化的可能性较少。
- 过程式代码中,对add User的处理混杂在一起,存在大量的if else等。改造为事件驱动代码后,对add User的处理分散在各个类中,每一块代码都较少, 容易理解。
- 大多数时候,我们都在用面向对象语言编写面向过程代码(大多数时候代码也都可用)。事件驱动方式,强制开发者对事件进行抽象。
glue即为胶水的意思,意图就是将分散在各个位置的代码按配置整合起来
若一个Service 依赖的 Service 较少,则不必要使用Glue
基本接口
假设存在UserService,执行addUser时,依赖AService,BService,CService。 则抽取UserAddListener/UserChangeListener 接口,由ABC Service 实现
原有代码:
class UserService{
@Autowire
private AService aService;
@Autowire
private BService bService;
@Autowire
private CService cService;
void addUser(User user){
// business code
aService.addUser(user);
bService.addUser(user);
cService.addUser(user);
}
}
简化代码:
-
调用方
class UserService{ void addUser(User user){ // business code // 调用所有实现UserAddListener onUserAdd 方法 并 设置 GlueListener 的实例方法执行 Glues.call(UserAddListener.class,"onUserAdd",args) } }
-
被调用方
class AService implements UserAddListener{ @GlueListener(name="123") void onUserAdd(User user){ //... } }
-
spring 配置文件
<bean class="com.lqk.glue.GlueBeanPostProcessor"/>
三个任意配置一个
- before,指定在哪个name之前执行
- after,指定在哪个name之后执行
- order,指定执行顺序,从小到大
当下为中断事件处理并抛出
当下为串行执行所有事件,为提高处理速度,可以
- 发布事件后,立即返回,异步处理所有事件。
- 发布事件后,所有监听者并行处理,待处理完毕后,合并结果,返回
当下
<bean class="org.lqk.glue.GlueBeanPostProcessor"/>
期待
<glue enable="true"/>