# 开发语法

扩展插件虽然是基于SpringBoot进行实现的,但由于个人技术有限,支持的注解只有一部分,欢迎各位提交pr或交流实现方式,下文讲解了插件开发提供的接口及注解支持

# 插件主类

我们可以在插件模块里新建一个类来实现Plugin接口,该类会在插件发生状态变化时调用,如启动时,安装时,卸载时以及更新时调用

/**
 * @description 扩展插件主类,插件状态发生改变时会调用
 * @author Perfree
 * @date 2021/8/17 15:11
 */
public class HelloWorldPlugin implements Plugin {
    @Override
    public void onStart() {
        System.out.println("插件启动时调用");
    }

    @Override
    public void onUpdate() {
        System.out.println("插件更新时调用");
    }

    @Override
    public void onInstall() {
        System.out.println("插件安装时调用");
    }

    @Override
    public void onUnInstall() {
        System.out.println("插件卸载时调用");
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 注解支持

插件开发与普通的Springboot程序开发基本一致,只不过没有Application启动类而已,目前支持的注解只有: @Controller,@RestController,@Mapper,@Component,@Service

# @Controller和@RestController

插件支持@Controller和@RestController注解,如需返回html页面,只需在resources下创建对应的html文件即可,以下是controller相关的示例

/**
 * @description 扩展插件: controller示例
 * @author Perfree
 * @date 2021/8/17 15:08
 */
@Controller
public class HelloWorldController{

    @Autowired
    private HelloWorldService helloWorldService;

    @RequestMapping("/plugin/test1")
    @ResponseBody
    public String test1 () {
        return "插件测试:返回字符串";
    }

    @RequestMapping("/plugin/test2")
    @ResponseBody
    public String test2 () {
        return helloWorldService.test2();
    }

    @RequestMapping("/plugin/test3")
    public String index3 (Model model) {
        model.addAttribute("article", "插件测试: 返回html");
        return "/static/index.html";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# @Service

@Service注解用法同样与Springboot用法一致,但在Services中,通常我们会获取Mapper接口,这里获取Mapper方式有些改变,需要手动获取,以下为示例

/**
 * @description 扩展插件: Service示例,tips: 因个人能力有限,此处注入mapper的方式为手动
 * 获取bean,使用@Autowired会造成报错, 欢迎能帮忙解决的大佬提交pr
 * @author Perfree
 * @date 2021/8/17 15:08
 */
@Service
public class HelloWorldService{

    private final HelloWorldMapper helloWorldMapper;

    /**
     * @description 注入mapper
     * @author Perfree
     */
    HelloWorldService() {
        helloWorldMapper = SpringBeanUtils.getMapper(HelloWorldMapper.class);
    }

    public String test2() {
        return "插件测试-查询数据库文章数量结果: " + helloWorldMapper.test2();
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# @Mapper

@Mapper注解同样与Springboot程序保持一致,但暂时不支持Mapper.xml的定义,仅支持注解方式写sql,如下:

/**
 * @description 扩展插件: Mapper示例,tips: 暂时只支持注解方式写sql
 * @author Perfree
 * @date 2021/8/17 15:08
 */
@Mapper
@Component
public interface HelloWorldMapper{
    @Select("select count(1) from `p_article`")
    String test2();
}

1
2
3
4
5
6
7
8
9
10
11
12

# 自定义模板指令

扩展插件同时支持自定义模板指令供页面使用,开发自定义模板指令需要继承BaseDirective类及添加@TemplateDirective("")注解,如下:

/**
 * @description 扩展插件,自定义模板指令示例
 * @author Perfree
 * @date 2021/8/17 15:08
 */
@TemplateDirective("sub")
public class SubDirective extends BaseDirective {
    public void setExprList(ExprList exprList) {
        super.setExprList(exprList);
    }

    @Override
    public void exec(Env env, Scope scope, Writer writer) {
        String str = getParam(0, scope).toString();
        int maxLength = getParamToInt(1, scope, 0);
        String result;
        if (str.length() > maxLength) {
            result = str.substring(0, maxLength);
        } else {
            result = str;
        }
        write(writer, result);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Last Updated: 8/18/2021, 11:30:43 AM