【8.0】【event】完善事件发布过程

pull/57/head
fengshuonan 2023-07-14 16:42:54 +08:00
parent 64643fa1d8
commit e5227ab533
5 changed files with 101 additions and 31 deletions

View File

@ -42,9 +42,4 @@ public @interface BusinessListener {
*/
String businessCode() default "";
/**
*
*/
Class<?> clazz();
}

View File

@ -24,7 +24,9 @@
*/
package cn.stylefeng.roses.kernel.event.sdk;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.event.api.annotation.BusinessListener;
import cn.stylefeng.roses.kernel.event.sdk.container.EventContainer;
import cn.stylefeng.roses.kernel.event.sdk.pojo.BusinessListenerDetail;
import cn.stylefeng.roses.kernel.rule.util.AopTargetUtils;
import lombok.extern.slf4j.Slf4j;
@ -33,6 +35,7 @@ import org.springframework.beans.factory.config.BeanPostProcessor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* Event
@ -73,21 +76,14 @@ public class EventAnnotationScanner implements BeanPostProcessor {
* @since 2023/7/14 15:24
*/
private void doScan(Class<?> clazz, String beanName) {
ArrayList<BusinessListenerDetail> businessListenerDetails = new ArrayList<>();
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
BusinessListener businessListener = declaredMethod.getAnnotation(BusinessListener.class);
log.debug("扫描到业务事件监听: " + businessListener);
if (businessListener != null) {
BusinessListenerDetail businessListenerDetail = createDefinition(beanName, declaredMethod, businessListener);
if (businessListenerDetail != null) {
businessListenerDetails.add(businessListenerDetail);
}
log.debug("扫描到资源: " + businessListenerDetail);
createEventDetail(beanName, declaredMethod, businessListener);
}
}
}
@ -98,10 +94,35 @@ public class EventAnnotationScanner implements BeanPostProcessor {
* @author fengshuonan
* @since 2023/7/14 15:27
*/
private BusinessListenerDetail createDefinition(String beanName, Method method, BusinessListener businessListener) {
private void createEventDetail(String beanName, Method method, BusinessListener businessListener) {
// 获取注解上的业务编码标识
String businessCode = businessListener.businessCode();
// 从容器中获取本业务标识是否创建
List<BusinessListenerDetail> listener = EventContainer.getListener(businessCode);
if (ObjectUtil.isEmpty(listener)) {
listener = new ArrayList<>();
}
return new BusinessListenerDetail();
// 创建当前方法的调用信息
BusinessListenerDetail businessListenerDetail = new BusinessListenerDetail();
businessListenerDetail.setBeanName(beanName);
businessListenerDetail.setListenerMethod(method);
// 获取方法参数信息
int parameterCount = method.getParameterCount();
if (parameterCount == 0) {
businessListenerDetail.setParameterClassType(null);
} else {
businessListenerDetail.setParameterClassType(method.getParameterTypes()[0]);
}
listener.add(businessListenerDetail);
// 放到事件容器中
EventContainer.addListenerList(businessCode, listener);
}
}

View File

@ -23,4 +23,11 @@ public class BusinessListenerDetail {
*/
private Method listenerMethod;
/**
*
* <p>
* null
*/
private Class<?> parameterClassType;
}

View File

@ -1,5 +1,6 @@
package cn.stylefeng.roses.kernel.event.sdk.publish;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.event.sdk.container.EventContainer;
import cn.stylefeng.roses.kernel.event.sdk.pojo.BusinessListenerDetail;
@ -8,35 +9,68 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2023/7/14 16:21
*/
public class BusinessEventPublisher {
/**
*
* <p>
* @BusinessListener
*
* @author fengshuonan
* @since 2023/7/14 15:37
*/
public static <T> void publishEvent(String businessCode, T businessObject) {
// 获取该业务是否有监听器
List<BusinessListenerDetail> listener = EventContainer.getListener(businessCode);
for (BusinessListenerDetail businessListenerDetail : listener) {
String beanName = businessListenerDetail.getBeanName();
Method listenerMethod = businessListenerDetail.getListenerMethod();
Object bean = SpringUtil.getBean(beanName);
try {
listenerMethod.invoke(bean, businessObject);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
// 没有监听器则直接返回
if (ObjectUtil.isEmpty(listener)) {
return;
}
// 依次调用监听器方法,进行回调调用
for (BusinessListenerDetail businessListenerDetail : listener) {
// 监听器的Spring Bean
String beanName = businessListenerDetail.getBeanName();
Object bean = SpringUtil.getBean(beanName);
// 监听器的具体方法
Method listenerMethod = businessListenerDetail.getListenerMethod();
Class<?> parameterClassType = businessListenerDetail.getParameterClassType();
// 如果发布事件的时候参数是空的,则直接调用无参的方法
if (ObjectUtil.isEmpty(businessObject)) {
// 如果方法的参数数量为0则直接调用如果不为0则跳过执行下个
if (parameterClassType == null) {
try {
listenerMethod.invoke(businessObject);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
// 如果发布事件的时候包含参数则判断method的第一个参数是否和businessObject的class一样不一样则不调用
else {
if (parameterClassType != null && parameterClassType.equals(businessObject.getClass())) {
try {
listenerMethod.invoke(bean, businessObject);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
}
}
}

View File

@ -24,6 +24,8 @@
*/
package cn.stylefeng.roses.kernel.event.starter;
import cn.stylefeng.roses.kernel.event.sdk.EventAnnotationScanner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
@ -35,4 +37,15 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class EventAutoConfiguration {
/**
*
*
* @author fengshuonan
* @since 2023/7/14 16:00
*/
@Bean
public EventAnnotationScanner eventAnnotationScanner() {
return new EventAnnotationScanner();
}
}