使用注解方式自动配置路由.

通过注解实现路由前缀配置,并自动扫描,主要是减少Routes的继承与书写.可以向spring系列一样,在controller加上@RequestMapping来实现路由前缀配置.拦截器配置,视图路径配置等

使用方式:

第一步:

@Override
public void configRoute(Routes routes) {
    // 自定义自动扫描路由工具,与系统不冲突
    RoutesKit.initRoutes(routes);
}

第二步,在Controller上加上使用的注解即可,可以配置viewPath,与拦截器

@RequestMapping("/u")
public class LoginController extends BaseController {
    ....
}

具体实现代码:

定义注解,主要有 路由,视图路径,与拦截器三个属性

/***
 * 请求映射前缀, 只能用于类上  
 * 例如:RequestMapping("/hello),则 实际url为 /hello/方法名称
 */
@Retention(RUNTIME)
@Target(TYPE)
public @interface RequestMapping {
    /***
     * 请求的前缀
     */
    String value() default "/";

    /***
     * 返回视图的前缀,用于没有分离视图用,如果没有配置,则默认使用路由的前缀
     */
    String viewPath() default "";

    /***
     * 拦截器
     */
    Class<? extends Interceptor>[] interceptor() default {};
}

具体扫描实现:

/**
 * @createTime: 2019/1/6
 * @author: HingLo
 * @description: 路由自动扫描工具
 */
public class RoutesKit {
    /***
     * 初始化路由工具 在JFinalConfig中configRoute方法中调用,通过对controller上加上RequestMapping 来自动扫描与初始化路由<br>
     * 需要通过:hutool工具包中ClassUtil工具来进行扫描类
     * @param routes JFinalConfig 中路由配置的configRoute 参数
     */
    public static void initRoutes(Routes routes) {
        //扫描项目下的所有的带有RequestMapping 的Controller
        Set<Class<?>> set = ClassUtil.scanPackageBySuper("", Controller.class);
        for (Class x : set) {
            RequestMapping annotation = (RequestMapping) x.getAnnotation(RequestMapping.class);
            // 用来限制只有加上了RequestMapping注解的controller才进行自动初始化
            if (annotation == null) {
                continue;
            }
            // 获取controllerKey
            final String path = getPath(annotation.value());
            // 获取视图路径
            String viewPath = annotation.viewPath();
            // 获取拦截器
            Class<? extends Interceptor>[] interceptor = annotation.interceptor();

            Routes routes1 = new Routes() {
                @Override
                public void config() {
                    // 添加拦截器
                    if (interceptor.length > 0) {
                        for (Class<? extends Interceptor> aClass : interceptor) {
                            addInterceptor(ReflectUtil.newInstance(aClass));
                        }
                    }
                    // 设置视图,如果视图是空,使用path 作为视图路径
                    setBaseViewPath(StrKit.isBlank(viewPath) ? path : viewPath);
                    // 设置路由
                    add(path, x);
                }
            };
            routes.add(routes1);
        }
    }

    /***
     * 请求路由处理
     * @param path 原始路由
     * @return 返回处理后的路由
     */
    private static String getPath(String path) {
        path = path.trim();
        if (!path.startsWith("/")) {
            path = "/" + path;
        }
        if (path.endsWith("/")) {
            path = path.substring(0, path.length() - 1);
        }
        return path;
    }

结尾:自此就结束了,整体代码都不是很多,但是需要引入:hutool这个工具包进行Controller扫描.hutool工具包的地址:Hutool 工具包文档地址

评论区

JFinal

2019-01-07 10:41

感谢分享

happyboy

2019-01-08 16:19

@JFinal 波总不是一直不建议通过注解管理路由吗,^_^

JFinal

2019-01-08 16:20

@happyboy 个人不建议,有些同学习惯用这个

HingLo

2019-01-08 16:58

@happyboy 是这样的,有时候忘记controller的访问前缀,我需要点击controller跳转路由配置类上去看,有点不好,如果在controller上直接配置访问前缀,这样有时候会方便些,

happyboy

2019-01-09 14:48

@HingLo 我现在用的也是通过注解配置路由。不过波总说的对,通过注解对性能没啥好处,尤其是会拖慢启动速度。不过通过注解配置路由确实挺方便,尤其是团队开发的时候,每个人在自己的类中声明路由,否则就得大家共同维护一个路由类,或者只能由项目经理统一在类中给大家配置好路由。

HingLo

2019-01-09 21:52

@happyboy 是的是的 主要是有时候看到方法不知道它的具体访问url,需要去路由类去查看 ,不是很方便