相关链接
基于此文章的优化KoaBoot结构
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的,请看下面的示例
在示例中能够看到 DefaultListableBeanFactory 类,这个类是中心类,一切通过Koa-Boot扫描而且创立的类的实例都会放入 singleton 特点当中,该特点作为存储目标的容器,也便是IOC容器
依靠注入
有了IOC容器,自然就必不可少的依靠注入,在Spring中有一个经典的问题,那便是循环依靠注入问题,在Spring底层里都是用反射进行依靠注入,在Spring中创立一个目标时,都会把目标上的特点通过反射注入,如果两个类都彼此注入Spring就会形成循环依靠的问题。那么在Koa-Boot中怎么防止的呢。请看下面示例
看的一脸懵逼是吧,那必须的,他人的代码怎么可能看得懂。示例中这段代码是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中是怎么解析的呢,请看下面的示例
此办法是负责解析KoaBootRouter目标,而且结构KoaRouter目标的办法,结构出来的目标会在解析完结后在Koa中一致起注册
结语
以上便是关于Koa装修器开发的一些根底介绍,本次Demo是一个突发奇想的产品,也仅仅做了一些简略的封装,无法应对企业级开发,但是关于个人开发来说完全没问题,Koa-Boot不管是开发体会,还是想学习后端的前端同学来说都是不错的项目。能够无缝进入开发状况,语言都不需求更换,直接就能够进行代码编写。有用给个鼓励支持下,谢谢少侠!!
项目代码传送门