系列文章地址: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
@Lazy
private 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<String, Object> pathVariables,
@RequestHeader(required = false) Map<String, Object> defaultHeaders,
@RequestParam(required = false) Map<String, Object> 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 处理失败抛出的异常
*/
@ResponseBody
public Object invoke(HttpServletRequest request, HttpServletResponse response,
@PathVariable(required = false) Map<String, Object> pathVariables,
@RequestHeader(required = false) Map<String, Object> defaultHeaders,
@RequestParam(required = false) Map<String, Object> parameters) throws Throwable {
return "香菜";
}
}
4.3 注册处理类到requestMapping
@Configuration
public class MappingConfig {
@Autowired
public 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