package com.example.demo.event;
import org.springframework.context.support.AbstractApplicationContext;
import java.util.*;
public class AuthEventBus {
private static Map<String, List<IAuthEventHandler>> EVENT_BUS = new HashMap();
public static void addEvent(String handlerKey, IAuthEventHandler handler) {
List<IAuthEventHandler> handlerList = new ArrayList<>();
if (EVENT_BUS.containsKey(handlerKey)) {
handlerList = EVENT_BUS.get(handlerKey);
}
handlerList.add(handler);
Collections.sort(handlerList, new Comparator<IAuthEventHandler>() {
@Override
public int compare(IAuthEventHandler o1, IAuthEventHandler o2) {
return o1.getOrder() - o2.getOrder();
}
}
);
EVENT_BUS.put(handlerKey, handlerList);
}
public static void emit(String handlerKey, AuthEvent event) {
if (!EVENT_BUS.containsKey(handlerKey)) {
return;
}
List<IAuthEventHandler> handlerList = EVENT_BUS.get(handlerKey);
for (IAuthEventHandler handler : handlerList) {
switch (event.getEventEnum()) {
case BEFORE:
try {
handler.handlerBefore(event);
} catch (Exception e) {
e.printStackTrace();
}
case AFTER:
try {
handler.handlerAfter(event);
} catch (Exception e) {
e.printStackTrace();
}
default:
break;
}
if (!event.isContinueFlag()) {
return;
}
}
}
public static void initEvent(AbstractApplicationContext context){
Map<String,Object> beanMap=context.getBeansWithAnnotation(AuthEventAnno.class);
beanMap.forEach((key,eventHandler) ->{
if(eventHandler instanceof IAuthEventHandler){
AuthEventAnno annotation = eventHandler.getClass().getAnnotation(AuthEventAnno.class);
addEvent(annotation.eventCode(), (IAuthEventHandler) eventHandler);
}
});
}
}
package com.example.demo.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AuthEvent {
private boolean continueFlag=true;
private AuthEventEnum eventEnum=AuthEventEnum.BEFORE;
private Map<String,Object> eventDate=new HashMap<String,Object>();
private Map<String,Object> eventArgs=new HashMap<String,Object>();
private List<Map<String,Object>> eventDataList=new ArrayList<Map<String,Object>>();
public AuthEvent() {
}
public AuthEvent(AuthEventEnum eventEnum, Map<String, Object> eventDate) {
this.eventEnum = eventEnum;
this.eventDate = eventDate;
}
public AuthEvent(Map<String, Object> eventDate) {
this.eventDate = eventDate;
}
public AuthEvent(AuthEventEnum eventEnum, Map<String, Object> eventDate, Map<String, Object> eventArgs) {
this.eventEnum = eventEnum;
this.eventDate = eventDate;
this.eventArgs = eventArgs;
}
public AuthEvent(boolean continueFlag, AuthEventEnum eventEnum, Map<String, Object> eventDate, Map<String, Object> eventArgs, List<Map<String, Object>> eventDataList) {
this.continueFlag = continueFlag;
this.eventEnum = eventEnum;
this.eventDate = eventDate;
this.eventArgs = eventArgs;
this.eventDataList = eventDataList;
}
public boolean isContinueFlag() {
return continueFlag;
}
public void setContinueFlag(boolean continueFlag) {
this.continueFlag = continueFlag;
}
public AuthEventEnum getEventEnum() {
return eventEnum;
}
public void setEventEnum(AuthEventEnum eventEnum) {
this.eventEnum = eventEnum;
}
public Map<String, Object> getEventDate() {
return eventDate;
}
public void setEventDate(Map<String, Object> eventDate) {
this.eventDate = eventDate;
}
public Map<String, Object> getEventArgs() {
return eventArgs;
}
public void setEventArgs(Map<String, Object> eventArgs) {
this.eventArgs = eventArgs;
}
public List<Map<String, Object>> getEventDataList() {
return eventDataList;
}
public void setEventDataList(List<Map<String, Object>> eventDataList) {
this.eventDataList = eventDataList;
}
}
package com.example.demo.event;
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthEventAnno {
String eventCode() default "";
String desc() default "";
int order() default 0;
}
package com.example.demo.event;
public enum AuthEventEnum {
BEFORE,
AFTER
}
package com.example.demo.event;
public interface IAuthEventHandler {
void handlerBefore(AuthEvent authEvent) throws Exception;
void handlerAfter(AuthEvent authEvent) throws Exception;
public int getOrder();
}
package com.example.demo.event;
import org.springframework.stereotype.Component;
@Component
@AuthEventAnno(eventCode ="XXXXX",desc="XXXXX")
public class test implements IAuthEventHandler{
@Override
public void handlerBefore(AuthEvent authEvent) throws Exception {
System.out.println(authEvent.getEventArgs());
}
@Override
public void handlerAfter(AuthEvent authEvent) throws Exception {
}
@Override
public int getOrder() {
return 0;
}
}