本文介绍了苍穹平台与Spring在注解支持上的差异,并展示了Spring注解如何提升开发效率。随后,文章探讨了苍穹平台在注解支持上的不足,并通过实例展示了传统事件处理方式的繁琐与注解方式的优势。文章还详细阐述了如何设计并实现一个@OnClick注解体系,包括注解的定义、复合注解的使用以及@AliasFor注解在复合注解中的应用,旨在通过社区力量逐步完善苍穹平台的注解支持。
1.前言
苍穹平台是一个独立开发的平台,在使用风格上与spring有许多不同,最大的区别莫过于注解。
Spring或SpringBoot项目往往是注解驱动的,丰富的注解大大降低了开发成本。下面是一个简单的SpringBoot项目代码样例。
@Autowired private UserService userService; @RequestMapping(path="/index",method= RequestMethod.GET) public String getIndexPage(ModelAndView mv){ return "/index" }
我们看到只需要加上@RequestMapping注解就可以处理"/index"请求同时也可以制定请求方法,还可以自动注入ModelAndView 对象,想想原来的jsp和servlet时代的代码,这毫无疑问大大提升了程序员的开发效率。
使用苍穹平台进行低代码开发,对于程序员开发效率的提升同样也是无可比拟的,但美中不足的是,苍穹平台对于注解的支持不是很好。本着社区精神,本文对注解支持进行探究,不过一个研究性的内容并不能指望他多完善,实际用起来可能bug也很多,本人仅仅支持了两个注解,希望社区中的大佬多多指正,每个人贡献一点点代码,逐步通过社区的力量逐渐完善对注解的支持。
2.探究注解
2.1 痛点
public class TextFieldClick extends AbstractFormPlugin { @Override public void click(EventObject evt) { super.click(evt); Control source = (Control)evt.getSource(); if (StringUtils.equals(KEY_TEXTFIELD1, source.getKey())){ // TODO 在此添加业务逻辑 } } }
相信大家初学时一定看到了这样的代码,当我们兴致勃勃的去点击事件时往往会发现,
“诶???怎么点这个按钮没反应,哦哦哦原来是忘记加标识了”
private final static String KEY_TEXTFIELD1 = "textfield1";
“好了标识加好了,诶诶诶怎么还没有反应,哦,原来是忘记注册了…”
public void registerListener(EventObject e) { super.registerListener(e); // 侦听文本字段按钮点击事件 this.addClickListeners(KEY_TEXTFIELD1); }
随着click的增多我们的代码会逐渐变成…
if("signA".equals(key)){ ... }else if("signB".equals(key)){ ... }else if("signC".equals(key)){ ... }else if("signD".equals(key)){ ... }else if("signE".equals(key)){ ... } . . .
会慢慢陷入if else地狱…
所以我们想,如果不需要注册事件,不需要写if else那该多好。示例代码变成这样多好…
public class test2From extends AbstractFormAnnotationPlugin { @OnClick(control ="A") public void A(EventObject e){ ... }
@OnClick注解是真的多好…
2.2 @OnClick注解的实现
2.2.1 注解体系
既然要支持@OnClick注解注解,首先要先把它定义出来喽
@Documented @Retention(RetentionPolicy.RUNTIME) @Inherited @Target(ElementType.METHOD) public @interface OnClick{ String control(); } //以后省略元注解不写
但是这样遇到的问题也很明显,由于注解不能进行继承,每一类接口需要一个注解,不但抽象能力差,而且开发难度也很大。
但是我们可以通过复合注解的方式实现类似于注解继承的功能。关于复合注解的概念,这里不赘述。
所以
最终设计出来了一个简单的注解复合体系
@FromEvent注解用来标识方法需要被代理
public @interface FormEvent { }
@Click注解用来标识这是一个Click方法,复合了FormEvent注解
@FormEvent public @interface Click { String control() default ""; } //control就是以前要写的标识
@Onclick和@OnItemClick注解用来标识原有的click和itemclick方法。他们都复合了@Click注解
@Click public @interface OnClick{ @AliasFor(annotation = Click.class,attribute ="control") String control(); }
@Click public @interface OnItemClick { @AliasFor(annotation = Click.class,attribute ="control") String control(); String event(); }
特别说明@AliasFor注解就是spring中用来复合注解的注解,文章后边会用到spring的两个用于处理注解的类,有兴趣可以阅读一下spring这两个类的源码。
@AliasFor(annotation = Click.class,attribute ="control")
文章过长下一P再见
END
推荐阅读