[非官方]苍穹平台@注解支持探究(一)注解体系设计原创
金蝶云社区-shiro
shiro
18人赞赏了该文章 1,119次浏览 未经作者许可,禁止转载编辑于2022年09月08日 09:21:38

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


赞 18