开发后端接口服务时可能会用到SpringMVC, 然而SpringMVC会用到Servlet, 而Servlet又依赖tomcat等容器。
为了高并发要求,我们可以实现部分SpringMVC的功能,而且又不会依赖容器启动。
首先,要写个RequestMapping那样的注解类
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface RequestMapping {
@AliasFor("value")
String[] path() default {};
@AliasFor("path")
String[] value() default {};
}
然后是扫包代码:
CONTROLLERS_PKG : controller层的包路径
Reflections reflections = new Reflections(CONTROLLERS_PKG);
// 这里的方式是获取继承了BaseController类的所有子类(需要继承该类, 此处和springMVC不同)
// 然后得到 请求路径与类的一一对应关系,放进map中, 这个Map接下来会用到
Iterator subTypes = reflections.getSubTypesOf(BaseController.class).iterator();
while (subTypes.hasNext()) {
Class<? extends BaseController> subClass = (Class<? extends BaseController>) subTypes.next();
if (subClass.isAnnotationPresent(RequestMapping.class)) {
String[] paths = (String[]) ArrayUtils.addAll(
subClass.getAnnotation(RequestMapping.class).value(),
subClass.getAnnotation(RequestMapping.class).path());
for (String path : paths) {
mappings.put(path, subClass);
}
}
}
接下来是接口地址和类的匹配代码
思路很简单,就是取出url中的Path部分,将之作为key,去上一步生成的map中去取value即可
String uri = new URI(request.uri()).getPath()
Class<? extends BaseController> controllerClass = mapping.getController(uri);
value表示相应的类,接下来的工作就简单了, 只需要实例化之再调用相应的方法即可。
本文介绍了一种不依赖容器的SpringMVC实现方案,通过自定义RequestMapping注解及扫描控制器类来完成接口映射。
1544

被折叠的 条评论
为什么被折叠?



