相关链接

基于此文章的优化KoaBoot结构

KoaBoot结构的运用教程

压阵效果图,见此图都给我点赞,好人一生十八胎

项目发动

轻量级IOC框架KoaBoot的问世

控制器

轻量级IOC框架KoaBoot的问世

恳求效果

轻量级IOC框架KoaBoot的问世

这儿小吹一波,从未见过如此高雅的Koa开发

Koa开发的痛点

当我想恳求一个接口,运用Koa编写如下

import Koa, { Context } from 'koa'
import KoaRouter from 'koa-router'
import KoaJSON from 'koa-json';
const app = new Koa();
const router = new KoaRouter({ prefix: "/admin" });
app.use(KoaJSON());
app.use(router.routes());
router.post("/list", async (ctx:Context ) => {
    ctx.body = {
        code: 200,
        data: null,
        message: "恳求成功"
    }
})
router.get("/list/1", async (ctx:Context ) => {
    ctx.body = {
        code: 200,
        data: ctx.request.query,
        message: "恳求成功"
    }
})
app.listen(3002);

假定一个功用上有8个接口,那么我每个接口都是运用 router.get 或许 router.post 形式进行开发,到后边一个TS文件上会有多个这样的形式(如上图的GET恳求),代码看起来不够高雅漂亮,负责处理呼应的结束也没有进行一致回来,能够是各式各样的数据结构。关于害怕麻烦的程序员来说这是一件非常糟糕的事情,每次呼应我都要从头写一次呼应的数据结构。这关于想偷懒的程序员来说是不可容忍的。综上所述,一切的这些问题都会在Koa-Boot中得到处理。

友爱的Koa-Boot开发

在前面的示例中体现了Koa开发的痛点,那么Koa-Boot怎么处理的呢,请看下面的示例

import { AutoWired, Controller, RequestMapping, GetMapping, PostMapping } from '../../framework/src/main/node/context/Decorator'
import SystemService from '../service/SystemService';
import Result from '../../framework/src/main/node/mvc/Result';
import { Context } from 'koa';
import { ParsedUrlQuery } from 'querystring';
@Controller
@RequestMapping("/admin")
class SystemController {
    @AutoWired
    private systemService: SystemService;
    @PostMapping("/list")
    public test(): Result<string> { 
        return Result.success(this.systemService.test());
    }
    @GetMapping("/list/1")
    public test1(ctx: Context): Result<ParsedUrlQuery> {
        return Result.success(ctx.request.query);
    }
}
export default SystemController;

在合作装修器运用的Koa开发,从开发效果上看,一个TS文件就只有一个类,每一个类上的办法对应着一个功用恳求。而且在这儿运用了MVC的开发形式,让代码看起来结构分明。而且有清晰的回来值以及回来值的类型界说。开发一个接口只需求在功用类上添加一个办法,写上一个装修器就完结了一个接口功用的开发。

Koa-Boot 怎么做到装修器开发呢

关于运用装修器开发这个想法,我是基于Java的SpringBoot结构的来的创意,在我了解到TS中的装修器时,发现装修器的功用和效果都跟Java的注解相似。都是关于某个办法,或许某个类的功用增强。对此我斗胆尝试了一番。封装Koa结构运用装修器开发。

IOC容器

是的,你没有看错,Koa-Boot 连续运用了IOC这个编程思想,运用IOC的好处在于开发者不需求关心类与类依靠关系和类的实例化创立。关于开发者来说你只管界说一个类,剩下的交给IOC容器处理。那么Koa-Boot是怎么完结IOC的,请看下面的示例

轻量级IOC框架KoaBoot的问世

在示例中能够看到 DefaultListableBeanFactory 类,这个类是中心类,一切通过Koa-Boot扫描而且创立的类的实例都会放入 singleton 特点当中,该特点作为存储目标的容器,也便是IOC容器

依靠注入

有了IOC容器,自然就必不可少的依靠注入,在Spring中有一个经典的问题,那便是循环依靠注入问题,在Spring底层里都是用反射进行依靠注入,在Spring中创立一个目标时,都会把目标上的特点通过反射注入,如果两个类都彼此注入Spring就会形成循环依靠的问题。那么在Koa-Boot中怎么防止的呢。请看下面示例

轻量级IOC框架KoaBoot的问世

看的一脸懵逼是吧,那必须的,他人的代码怎么可能看得懂。示例中这段代码是Koa-Boot依靠注入和目标放入IOC容器的要害代码,由于TS中的装修器特性,类的实例早就提早创立好了,而且放在了一个缓冲类中也便是 BeanDefinition。TS的装修器只有在实例化后才会调用,这儿跟Java里的注解不同,在Java中注解是符号一个类,然后依据Java供给的Api获取到注解所符号的类或许办法等等。在TS里的装修只能实例化类后才会调用,因此在类的扫描阶段直接就创立好目标而且放入BeanDefinitionzh这个类中缓存起来了,特点注入依靠于装修器 @AutoWired 装修的特点,会给装修的特点打上一个符号,然后Koa-Boot会依据这些符号进行特点注入直接处理Spring中的循环依靠问题,由于目标早就已经创立好了。

Koa的封装

完结了IOC容器后,关于Koa的封装就简略许多,Koa-Boot供给一个KoaBootRouter类,装修器 @RequestMapping、@PostMapping 、@GetMapping 执行的时分,会结构 KoaBootRouter 类的目标,Koa-Boot会通过 KoaBootRouter 目标动态的创立Koa的路由从而完结接口的开发,那么Koa-Boot中是怎么解析的呢,请看下面的示例

轻量级IOC框架KoaBoot的问世
此办法是负责解析KoaBootRouter目标,而且结构KoaRouter目标的办法,结构出来的目标会在解析完结后在Koa中一致起注册

结语

以上便是关于Koa装修器开发的一些根底介绍,本次Demo是一个突发奇想的产品,也仅仅做了一些简略的封装,无法应对企业级开发,但是关于个人开发来说完全没问题,Koa-Boot不管是开发体会,还是想学习后端的前端同学来说都是不错的项目。能够无缝进入开发状况,语言都不需求更换,直接就能够进行代码编写。有用给个鼓励支持下,谢谢少侠!!

项目代码传送门