【Springboot系列】Springboot接管所有Controller,magic-api源码阅读
创始人
2024-05-31 20:35:18
0

系列文章地址:Spring Boot学习大纲,可以留言自己想了解的技术点

最近在项目中使用了一个第三方的包 magic-api,节省了很多的时间,整体来说就是只用写sql就好了,不用写service,controller那些,全部统一处理了。

具体的使用大家可以搜索下,网上到处都是,建议去官网看。

为了使用这个包,必须得大概了解下是怎么回事,要不然用的不踏实,这里面最重要的其实是脚本执行引擎的重定义,这部分我还没有深究,

这篇文章主要关注的是如何接管所有的controller。

1、magic-api的使用流程

magic-api 在启动之后会有一个网页界面,在界面中配置开放的接口和执行的脚本

这些接口会存到数据库或者文件中,在程序运行的过程中会加载所有的接口到内存中,等待调用

2、controller主要流程

在正常的请求过程中,都知道使用注解@Controller加上RequestMapping就可以将一个方法作为接口开放出来,可以看到下面的流程

DispatchServlet做为分发器,从handlerMapping类中查找对应的Method 方法,然后注入请求对象,进行调用,

magic-api 这里接管所有的controller必然要在handlerMapping中做点手脚

3、magic-api的处理方式

1.通过magic-api-spring-boot-starter的spring.factories可以看到启动类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.ssssssss.magicapi.spring.boot.starter.MagicAPIAutoConfiguration

/*** magic-api自动配置类*/
@Configuration
@ConditionalOnClass({RequestMappingHandlerMapping.class})
@EnableConfigurationProperties(MagicAPIProperties.class)
@Import({MagicJsonAutoConfiguration.class, ApplicationUriPrinter.class, MagicModuleConfiguration.class, MagicDynamicRegistryConfiguration.class})
@EnableWebSocket
@AutoConfigureAfter(MagicPluginConfiguration.class)
public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketConfigurer {

2.可以看到导入了几个配置类到容器中,其他的没怎么关注,直接在MagicDynamicRegistryConfiguration中查找

@Configuration
@AutoConfigureAfter(MagicModuleConfiguration.class)
public class MagicDynamicRegistryConfiguration {@Autowired@Lazyprivate RequestMappingHandlerMapping requestMappingHandlerMapping;

可以看到这里注入了RequestMappingHandlerMapping,想必一定是在这里进行的骚操作,继续往下看

3.ApiInfoMagicResourceStorage 是配置的接口,在这里做的注入

@Bean
@ConditionalOnMissingBean
public RequestMagicDynamicRegistry magicRequestMagicDynamicRegistry(ApiInfoMagicResourceStorage apiInfoMagicResourceStorage) throws NoSuchMethodException {return new RequestMagicDynamicRegistry(apiInfoMagicResourceStorage, Mapping.create(requestMappingHandlerMapping, properties.getWeb()), properties.isAllowOverride(), properties.getPrefix());
}

4.下面具体的就不做深入展开了,等下会讲原理

最后会讲所有的请求全部映射到RequestHandler里的invoke方法

*** 测试入口、实际请求入口** @param request       HttpServletRequest* @param response      HttpServletResponse* @param pathVariables 路径变量* @param parameters    表单参数&URL参数* @return 返回请求结果* @throws Throwable 处理失败抛出的异常*/
@ResponseBody
@Valid(requireLogin = false)
public Object invoke(HttpServletRequest request, HttpServletResponse response,@PathVariable(required = false) Map pathVariables,@RequestHeader(required = false) Map defaultHeaders,@RequestParam(required = false) Map parameters) throws Throwable {

4、自己实现,接管所有的controller到RequestHandler

4.1 创建springboot项目

idea一键next,没有难度,创建一个空的springboot web项目就好

4.2 创建一个controller的处理类,这里没有加controller的注解

这里直接拷贝了magic-api的RequestHandler,去除了业务逻辑

/*** 请求入口处理*/
@Component
public class RequestHandler {/*** 测试入口、实际请求入口** @param request       HttpServletRequest* @param response      HttpServletResponse* @param pathVariables 路径变量* @param parameters    表单参数&URL参数* @return 返回请求结果* @throws Throwable 处理失败抛出的异常*/@ResponseBodypublic Object invoke(HttpServletRequest request, HttpServletResponse response,@PathVariable(required = false) Map pathVariables,@RequestHeader(required = false) Map defaultHeaders,@RequestParam(required = false) Map parameters) throws Throwable {return "香菜";}
}

4.3 注册处理类到requestMapping

@Configuration
public class MappingConfig {@Autowiredpublic void setHandlerMapping(RequestMappingHandlerMapping mapping, RequestHandler handler) throws NoSuchMethodException {RequestMappingInfo info = RequestMappingInfo.paths("/caraway").methods(RequestMethod.GET).build();//    注意这里的方法签名,要和RequestHandler保持一致Method method =  RequestHandler.class.getDeclaredMethod("invoke", HttpServletRequest.class, HttpServletResponse.class, Map.class, Map.class, Map.class);mapping.registerMapping(info, handler, method);}
}

4.4 测试

输入地址:http://localhost:16002/caraway

端口记得改成你本地的端口,因为多开了几个服务,这里的端口是16002

如果看到下面的界面,证明我们注入成功了

4.5 开发遇到的问题

上面代码写完,本以为没有问题,但是在使用的时候一直报错

搜索了下:问题就是源自springboot 2.6.0后的新特性,目前版本的解决方案是在springboot的配置文件中,以下配置,修改默认映射策略:

spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

或者降低版本,如使用2.5.4版本

5、总结

magic-api 减少了很多繁琐的接口,开发速度很快。

requestMapping的动态导入controller,可以将业务接管

magic-api的脚本引擎还没研究,


推荐书

2020年9月“中国好书”、斩获第十六届文津奖图书奖的科普力作——《公式之美》火热畅销中,不管你是文科生还是理科生,它值得所有人了解与翻阅!

万物速朽,唯有公式永恒!本书通过人类最美的23个公式,用人文解析数学之美,重塑人类理性堤坝,抵挡盲信洪流,聚集日益退却的独立思考者,打破快餐式的碎片刷屏时间……用趣味解读发现科学之美,用公式智慧重构思考体系!

电商链接

京东:https://item.jd.com/12717209.html

当当:http://product.dangdang.com/29121842.html

相关内容

热门资讯

平板安卓进不了系统,故障排查与... 最近是不是你也遇到了这样的烦恼:平板安卓系统突然进不去系统了?别急,让我来帮你分析一下可能的原因,并...
安卓内存小怎么安装系统,系统安... 你有没有遇到过这种情况:手机内存小,想安装个新系统,结果发现空间不够用?别急,今天就来给你支个招,让...
掌机安卓系统串流,便携式游戏新... 你有没有想过,在小小的掌机设备上也能享受到安卓系统的流畅体验?没错,这就是今天我要跟你分享的神奇世界...
冠道系统支持安卓,畅享智能生活... 你知道吗?最近冠道系统更新了,竟然支持安卓系统了!这可真是让人眼前一亮的大好事啊!想象你的安卓手机和...
安卓系统打开c语言文件,基于安... 你有没有遇到过这样的情况:手里拿着安卓设备,突然想看看那些神秘的C语言文件,却一头雾水,不知道从何下...
安卓系统程序卸载工具,优化手机... 手机里的安卓系统程序越来越多,是不是感觉内存不够用了?别急,今天就来给你安利几款特别实用的安卓系统程...
安卓旗舰系统怎么样,性能与创新... 你有没有发现,最近安卓旗舰系统的更新速度简直让人眼花缭乱?作为一个紧跟科技潮流的数码爱好者,我可是对...
安卓系统新闻推送屏蔽,轻松享受... 你是不是也和我一样,每天手机里充斥着各种新闻推送,有时候甚至感觉被信息淹没了?别急,今天就来聊聊如何...
安卓系统好的手机品牌,盘点热门... 你有没有想过,为什么你的手机总是卡得要命,而别人的手机却流畅得像风一样?这其中的奥秘,就在于手机的品...
笔录本怎么安装安卓系统,安装指... 你有没有想过,你的笔录本也可以变身成安卓小能手呢?没错,就是那个我们日常使用的安卓系统,它现在也能在...
电脑台式双系统安卓,安卓与Wi... 你有没有想过,你的电脑台式机除了Windows系统,还能装个安卓系统?听起来是不是有点酷炫?没错,现...
安卓系统程序运行入口,启动流程... 你有没有发现,每次打开安卓手机,那些熟悉的图标就像小精灵一样跳出来,召唤你进入它们的奇妙世界?这就是...
安卓系统安装ehr移动服务,安... 你有没有想过,手机里的安卓系统竟然能帮你安装那种高大上的EHR(电子健康记录)移动服务呢?没错,就是...
安卓系统可以不用升级吗,也能畅... 你有没有想过,你的安卓手机是不是真的需要每次都升级呢?是不是有时候心里痒痒的,想看看新系统带来的新鲜...
怎样把安卓换成苹果系统,从安卓... 你有没有想过,把你的安卓手机换成苹果系统呢?想象那流畅的操作体验,那独特的iOS设计,是不是让你心动...
怎样把苹果导入安卓系统,探索将... 你有没有想过,把苹果手机里的宝贝照片、音乐、视频这些宝贝转移到安卓手机上呢?这可不是什么难事,只要跟...
安卓8.0系统设备支持,系统升... 你知道吗?最近安卓系统又升级啦!这次可是来到了安卓8.0的版本,听说支持了不少新设备呢。你是不是也好...
酷开装安卓系统吗,畅享智能娱乐... 亲爱的读者们,你是否曾对家里的智能电视产生过好奇,想知道它是不是也能像手机一样酷炫呢?今天,我们就来...
安卓游戏系统推荐知乎,解锁游戏... 你有没有想过,在手机上玩游戏,其实也是一种生活态度呢?想象手指轻轻一滑,就能进入一个全新的世界,那种...
小米9安卓系统怎么升级 你有没有发现,小米9这款手机自从你入手以来,性能越来越棒,但总觉得少了点什么?没错,就是那股子最新的...