模仿的Spring中的消息事件:详解Spring事件驱动模
代码简单无任何第三方依赖,具体使用如下:
- // 初始化插件EventPlugin plugin = new EventPlugin();
- // 设置为异步,默认同步,或者使用`threadPool(ExecutorService executorService)`自定义线程池。
- plugin.async();
- // 开启类扫描,默认为 false,用于不支持注解处理器的情况或者不实用 maven 等包管理的情况。
- plugin.enableClassScan();
- // 手动启动插件,用于main方法启动,jfinal中不需要,添加插件即可。
- plugin.start();
- // 停止插件,用于main方法测试
- plugin.stop();
新建事件类
- // 继承 ApplicationEvent
- public class Test1Event extends ApplicationEvent {
- private static final long serialVersionUID = 6994987952247306131L;
- public Test1Event(Object source) {
- super(source);
- }
- }
编写监听
- public class TestListener {
- @EventListener
- public void listenTest1Event(Test1Event event) {
- System.out.println("Test1Event:" + event.getSource());
- }
- @EventListener
- public void listenTest1Event(Test2Event event) {
- System.out.println("Test1Event:" + event.getSource());
- }
- }
发送事件
- EventKit.post(new Test1Event("hello1"));
@EventListener注解说明
- @EventListener(events = Test1Event.class, order = 1, async = true, condition = "event.isExec()")
说明
1. events支持的事件类型数组,用于将事件方法定义为ApplicationEvent或者自定义父类。
- @EventListener(events = Test1Event.class)
- public void applicationEvent(ApplicationEvent event) {
- String xx = (String) event.getSource();
- System.out.println(Thread.currentThread().getName() + "\tsource:" + xx);
- }
2. order排序,数值越小越先执行,默认为Integer.MAX_VALUE
3. async异步执行,需要插件开启async()或者自定义线程池。
4. condition表达式条件,使用event.xxxx,event.isExec() == true判定event的属性或者方法。
源码连接:http://git.oschina.net/596392912/JFinal-event
jar包下载:
http://central.maven.org/maven2/net/dreamlu/JFinal-event/
- <dependency>
- <groupId>net.dreamlu</groupId>
- <artifactId>JFinal-event</artifactId>
- <version>3.1.0</version>
- </dependency>
更新说明:
2020-01-10 v3.1.0
升级到jfinal 4.8。
google-auto 调整为自家的 mica-auto。
添加类扫描的开关,用于不是用 maven 等包管理的项目。
删除
ObjenesisBeanFactory
,已经没有存在的意义。
2019-07-19 v3.0.0
升级到jfinal 4.3。
完成【3.0优化 有生之年闲下来了弄吧】#IR96V 之2 将类扫描,改到编译期。
删除
ClassUtil
,但愿大伙没用这个类。
2017-11-29 v2.0.4
添加ObjenesisBeanFactory处理不含有默认构造器的Bean 依赖objenesisjar包,
下载地址:http://mvnrepository.com/artifact/org.objenesis/objenesis/2.6
2017-10-11 v2.0.3
支持多包名,用;分割,如:net.dreamlu.a;net.dreamlu.b。
插件初始化时,没有扫描到监听时依然初始化成功。
2017-10-11 v2.0.2
2.x bug修复版
2017-10-11 v2.0.1
插件添加Bean工厂,方便IOC容器和自定义扩展。 默认为DefaultBeanFactory,可实现IBeanFactory自定义扩展。plugin.beanFactory(new DuangBeanFactory());
2017-10-10 v2.0.0
基于注解和方法的兼听,简化使用,不兼容1.x
2017-04-28 v1.5.1
基于rmi的远程Event
2017-03-22 v1.4.2
更改默认线程池为SingleThreadExecutor,使异步执行有序化。
添加EventThreadFactory,处理异步时的异常避免影响服务请求。
建议:如果event需要发送大量的异步事件,建议使用自定义线程池。
如:eventPlugin.threadPool(Executors.newCachedThreadPool(new EventThreadFactory()));
2017-02-15 v1.4.1
添加自定义线程池EventPlugin.threadPool(ExecutorService executorService)方法
2016-08-19 v1.4.0
升级到JFinal2.2,JFinal低版本用户请使用v1.2.0。
EventKit.postEvent(event)更改为EventKit.post(event),postEvent不再建议使用。
添加EventKit.post(tag, event)方法,@Listener(order = 2, tag = "save")添加tag