import lombok.extern.slf4j.Slf4j;
import javax.annotation.Resource;
@Slf4j
public class BaseProcess {
// 具体方法根据业务逻辑而定
@Resource
private BusinessService businessService;
protected void process(MultiMsg multiMsg) {
businessService.excute();
}
}
import lombok.extern.slf4j.Slf4j;
import javax.annotation.PostConstruct;
/**
* 业务抽象执行类
*/
@Slf4j
public abstract class AbstractBusinessProcess extends BaseProcess {
@PostConstruct
protected void init() {
registerListener();
}
/**
* Listener注册
*/
protected abstract void registerListener();
@Override
public void process(MultiMsg event) {
log.info("处理公共逻辑");
super.process(multiMsg);
log.info("处理具体业务");
this.handle(multiMsg);
}
protected abstract void handle(MultiMsg event);
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class BusinessService {
public void excute(){
log.info("执行基础代码");
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class BusinessProcessDemo extends AbstractBusinessProcess {
@Override
protected void registerListener() {
SelectListener.registerListener("demoType", "demoName", this);
}
@Override
public void handle(MultiMsg event) {
log.info("业务场景1");
}
}
import lombok.Data;
@Data
public class MultiMsg {
private String type;
private String name;
// 其他属性
}
package org.example.design;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Listener选择器
*/
public class SelectListener {
/**
* 数据处理Listener集合
*/
private static Map<String, AbstractBusinessProcess> listenerMap = new ConcurrentHashMap<>();
/**
* 数据变更处理类注册
* 参数根据实际业务 场景而定
*/
public static void registerListener(String type, String name, AbstractBusinessProcess listener) {
String key = type + "_" + name + "_" + type;
listenerMap.put(key.toLowerCase(), listener);
}
/**
* 获取处理Listener
*/
public static AbstractBusinessProcess getListener(String type, String name) {
String key = type + "_" + name + "_" + type;
return listenerMap.get(key.toLowerCase());
}
}
1、事件
①声明一个天气事件的抽象类
2、
①声明一个天气的接口
4、触发机制
①触发
②播放结果
5、优化广播器(低耦合,高内聚)
将触发机制封装起来
调用时,就感知不到内部的实现
二、SpringBoot的监听者模式
1、SpringBoot框架事件
SpringBoot框架事件
SpringBoot将和事件封装了起来。
2、获取列表
getApplicationListeners方法,会先查询列表是否已经缓存过,如果没有,通过retrieveApplicationListeners方法取出。
在retrieveApplicationListeners方法中,会遍历,通过supportsEvent方法取出可以可以监听当前事件的,并添加至队列中去。
3、触发机制
假如当前事件是Starting,遍历,每个首先判断是否实现了SmartApplicationListener接口
如果实现,就比对当前Starting事件是否为该supportsEventType中可以监听的事件。
如果没有实现,也是比对该是否可以监听Starting事件。
4、自定
①实现ApplicationListener接口,只不过监听事件则恒定为ApplicationStartedEvent
②实现SmartApplicationListener接口,可以通过supportsEventType,来自定义监听事件。
③注册方法与系统初始化器一样