JFinal-event 3.0.0 发布,类扫描提到编译期提升十倍的启动速度

前言

距 gitee issues #IR96V 6个月,终于把【3.0优化】有生之年闲下来了弄吧的第二点优化进行了完善,鼓掌!!!

更新记录

2019-07-19 v3.0.0

  • 升级到jfinal 4.3。

  • 完成【3.0优化 有生之年闲下来了弄吧】#IR96V 之2 将类扫描,改到编译期。

  • 删除 ClassUtil,但愿大伙没用这个类。

更新说明

此次更新主要是采用 Annotation Processor 技术,将运行期的事件类扫描改到了编译期,加快服务的启动时间,减少各种容器差异导致的类扫描问题。

使用

maven

<dependency>
    <groupId>net.dreamlu</groupId>
    <artifactId>JFinal-event</artifactId>
    <version>3.0.0</version>
</dependency>

gradle >= 5.x

api("net.dreamlu:JFinal-event:3.0.0")
annotationProcessor("net.dreamlu:JFinal-event:3.0.0")

gradle < 5.x

compile("net.dreamlu:JFinal-event:3.0.0")

注意

  1. 3.0.0 由于使用了 Annotation Processor 技术,Idea 需要开启注解处理器。

  2. 对于手动导入 jar(非 maven、gradle)依赖管理的,您需要手动注入事件类或者在 classes 目录下新建 META-INF/dream.events 文件,格式如下:

net.dreamlu.event.test.Test1Listener
net.dreamlu.event.test.Test2Listener

启动插件(v3.0.0 去掉了类扫描跟加简单)

// 初始化插件
EventPlugin plugin = new EventPlugin();
// 设置为异步,默认同步,或者使用`threadPool(ExecutorService executorService)`自定义线程池。
plugin.async();
// 手动启动插件,用于main方法启动,jfinal中不需要,添加插件即可。
plugin.start();
// 停止插件,用于main方法测试,jfinal中不需要,添加插件即可。
plugin.stop();

新建事件类

public class AccountEvent {  
    private Integer id;  
    private String name;  
    private Integer age;  
    // 省略 get set
}

编写监听方法

public class Test1Listener { 
 
  @EventListener
  public void listenTest1Event(AccountEvent event) {      
      System.out.println("AccountEvent:" + event);
  }

}

发送事件

AccountEvent event = new AccountEvent();
event.setId(1);
event.setName("张三");
event.setAge(18);
EventKit.post(event);

回顾

或许这是最后的一个版本了,由于精力问题,笔者已经停止更新其他的几个 JFinal 插件,下面随我一起回顾下 JFinal-event 的这4年多。

  1. 2015-04-27 22:19:33 初始化项目 网名(孤独的√3)

  2. 2015-05-06 23:40:53 v0.1 版本发布推送到 maven 中央库

  3. 2015-06-25 21:01:13 v0.3 支持异步,去掉了 guava 包,因为只用了一个 Multimap 集合。

  4. 2015-07-04 17:43:23 v0.4.2 添加事件排序

  5. 2016-08-19 10:46:58 v1.4.0 添加事件 tag

  6. 2017-04-22 00:10:41 v1.5.1 添加了基于 rmi 的远程 Event(2.x弃用)

  7. 2017-10-10 11:23:34 v2.0.0 基于注解和方法的兼听,不再需要单独编写 Listener 类。

  8. 2018-03-02 17:05:33 v2.1.0 添加CtrlHolderEvent处理同步、异步中request、session、header等参数传递。网名(如梦技术)

  9. 2018-10-09 21:37:18 v2.2.2 升级到 jfinal 3.5 支持JFinal新版本的 bean inject。

  10. 2019-04-08 20:55:52 v2.3.0 支持普通类作为 event 事件源,不再需要继承 ApplicationEvent

感谢码云提供了这么好的一个平台作为码云提供了这么一个优秀的平台,也感谢 JFinal 从 JFinal 中学习到了不少极简设计。

最后

笔者近2年将更多的精力放到的我的新开源——Spring Cloud 微服务开发核心包

 mica:https://gitee.com/596392912/mica 欢迎 star ,各种骚操作等你来发现。

评论区

要输就输给追求

2019-07-22 23:21

@Dreamlu 那就谢谢大佬了。这个event真的特别有用

Dreamlu

2019-07-23 09:01

多参数好像么太大意义,event 里面加个变量好像更好,算了不折腾了,会增加不少复杂度

类扫描和编译处理这个会弄得很完美,请放心

Dreamlu

2019-07-23 09:11

@lyh061619 html 需要 http://www.atoolbox.net/Tool.php?Id=758 用这个转义一下再发

lyh061619

2019-07-23 09:17

@Dreamlu @要输就输给追求 @prelove 现在这样手挺好的不要随意更变方案的呢,我项目换3.0分分钟的事,只要改得版本号即可正常使用,只是以上两位兄台反馈用不了,估计他们项目maven配置哪没配置好,现在也只能猜测。我的maven配置(标签被过虑贴不了全部,只能贴片段代码):
在build中指向编译输出目录:
${project.artifactId}-${project.version}
${basedir}/src/main/java
${basedir}/src/test/java
${basedir}/src/main/webapp/WEB-INF/classes
${basedir}/src/main/webapp/WEB-INF/classes

在maven-compiler-plugin配置里添加:
-parameters

lyh061619

2019-07-23 09:20

@Dreamlu 好的,我的项目maven配置: <build>
<finalName>${project.artifactId}-${project.version}</finalName>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes</outputDirectory>
<testOutputDirectory>${basedir}/src/main/webapp/WEB-INF/classes</testOutputDirectory>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>12</source>
<target>12</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>-verbose</arg>
<arg>-Xlint:unchecked</arg>
<arg>-Xlint:deprecation</arg>
<arg>-bootclasspath</arg>
<arg>-extdirs</arg>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<warName>${project.artifactId}-${project.version}</warName>
<webResources>
<useCache>false</useCache>
<archiveClasses>false</archiveClasses>
<webResources>
<resource>
<directory>src/main/resources</directory>
<targetPath>WEB-INF/classes</targetPath>
<includes>
<include>**</include>
</includes>
</resource>
</webResources>
</webResources>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<forkMode>once</forkMode>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
</plugin>
</plugins>
</build>

要输就输给追求

2019-07-23 10:13

@lyh061619 你是用的idea 还是eclipse?

要输就输给追求

2019-07-23 11:06

我已经知道怎么弄了。eclipse里面还有一个地方要设置。项目右键选择,Properties->Java Compiler -> Annotation Processing 查看 “Enable Project Specific Settings” 确认 “Enable annotation processing” 被选中 然后,转到 Java Compiler -> Annotation Processing -> Factory Path 在这里需要把JFinal-event 3.0的jar包加进来。然后点击“Advanced” 按钮,会显示一个对话框。勾选 Run this container's processors in bath mode 。 下面会有一个框,列出net.dreamlu.processor.EventListenerProcessor 点击右下角 “OK”按钮 然后Apply and Close 按钮。重新编译项目就可以了。开发的时候也能生成dream.events文件了 @prelove

快乐的蹦豆子

2019-07-24 17:32

佩服佩服

冰雨

2019-07-25 11:33

@lyh061619 你可以截图,然后评论时这么来用《img src="图片路径" /》

晴天

2019-10-10 09:46

@要输就输给追求 牛X啊大神,这么搞确实可以了!

山东小木

2019-10-18 21:25

哪些业务场景 能更好的体现JFinal-Event的优势 这个和消息队列比呢 高并发情况表现如何?

热门分享

扫码入社