diff --git a/hsweb-eventbus/hsweb-eventbus-default/pom.xml b/hsweb-eventbus/hsweb-eventbus-default/pom.xml
index 92bec02a3..983b40cdf 100644
--- a/hsweb-eventbus/hsweb-eventbus-default/pom.xml
+++ b/hsweb-eventbus/hsweb-eventbus-default/pom.xml
@@ -30,5 +30,10 @@
org.hswebframework
hsweb-utils
+
+ org.hswebframework.web
+ hsweb-boost-compiler
+ ${project.version}
+
\ No newline at end of file
diff --git a/hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/FastListener.java b/hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/FastListener.java
new file mode 100644
index 000000000..cb207077d
--- /dev/null
+++ b/hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/FastListener.java
@@ -0,0 +1,51 @@
+package org.hswebframework.web.eventbus.spring;
+
+import org.hswebframework.web.boost.Compiler;
+import org.hswebframework.web.eventbus.EventListener;
+import org.springframework.util.ClassUtils;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author zhouhao
+ * @since 3.0
+ */
+public class FastListener implements EventListener {
+
+ private Object target;
+
+ private FastListenerCallable callable;
+
+ public FastListener(Object target, Method method) {
+ Class[] type = method.getParameterTypes();
+ Class targetType = ClassUtils.getUserClass(target);
+ this.target = target;
+ StringBuilder methodImpl = new StringBuilder();
+
+ methodImpl.append("public void call(Object target, Object event) throws Exception{\n")
+ .append(targetType.getName())
+ .append(" targetObj=(")
+ .append(targetType.getName())
+ .append(")target;\n").append("targetObj.")
+ .append(method.getName())
+ .append("((").append(type[0].getName()).append(")event);\n")
+ .append("}");
+
+ callable = Compiler.create(FastListenerCallable.class)
+ .addMethod(methodImpl.toString())
+ .newInstance();
+ }
+
+ @Override
+ public void onEvent(Object event) {
+ try {
+ callable.call(target, event);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public interface FastListenerCallable {
+ void call(Object target, Object event) throws Exception;
+ }
+}
diff --git a/hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBus.java b/hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBus.java
index 51b29bdc7..15a941b5b 100644
--- a/hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBus.java
+++ b/hsweb-eventbus/hsweb-eventbus-default/src/main/java/org/hswebframework/web/eventbus/spring/SpringEventBus.java
@@ -44,7 +44,7 @@ public class SpringEventBus extends AbstractEventBus implements BeanPostProcesso
protected void createListener(Subscribe type, Object target, Method method) {
EventListenerDefine define = EventListenerDefine.builder().eventMode(type.mode())
.transaction(type.transaction())
- .listener(new ReflectListener(target, method))
+ .listener(new FastListener(target, method))
.build();
subscribe(method.getParameterTypes()[0], define);
diff --git a/hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/SpringEventBusTest.java b/hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/SpringEventBusTest.java
index 14a8dc50b..8750cd320 100644
--- a/hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/SpringEventBusTest.java
+++ b/hsweb-eventbus/hsweb-eventbus-default/src/test/java/org/hswebframework/web/eventbus/spring/SpringEventBusTest.java
@@ -5,8 +5,6 @@ import org.hswebframework.web.eventbus.annotation.Subscribe;
import org.junit.Assert;
import org.junit.Test;
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -22,7 +20,9 @@ public class SpringEventBusTest {
public void test() throws InterruptedException {
System.out.println(Thread.currentThread().getName());
eventBus.postProcessAfterInitialization(new Test2(), "test");
+ long t = System.currentTimeMillis();
eventBus.publish(eventBus);
+ System.out.println(System.currentTimeMillis() - t);
Thread.sleep(1000);
Assert.assertEquals(counter.get(), 3);
}
@@ -30,22 +30,22 @@ public class SpringEventBusTest {
public class Test2 {
@Subscribe(mode = EventMode.SYNC)
public void test1(SpringEventBus eventBus) {
- System.out.println(Thread.currentThread().getName());
- System.out.println(eventBus);
+// System.out.println(Thread.currentThread().getName());
+// System.out.println(eventBus);
counter.addAndGet(1);
}
@Subscribe(mode = EventMode.ASYNC, transaction = false)
public void test2(SpringEventBus eventBus) {
- System.out.println(Thread.currentThread().getName());
- System.out.println(eventBus);
+// System.out.println(Thread.currentThread().getName());
+// System.out.println(eventBus);
counter.addAndGet(1);
}
@Subscribe(mode = EventMode.BACKGROUND, transaction = false)
public void test3(SpringEventBus eventBus) {
- System.out.println(Thread.currentThread().getName());
- System.out.println(eventBus);
+// System.out.println(Thread.currentThread().getName());
+// System.out.println(eventBus);
counter.addAndGet(1);
}
}