Springboot通过接口获取实现类的RequestMapping请求路径

一、前言 — 灵活使用 ApplicationContext

Springboot是一个很灵活的框架,借助这个框架可以实现很多我们需要的功能,下面我来简单介绍一下ApplicationContext 这个类

如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。

我们可以使用 ApplicationContext 获取RequestMapping的所有路径

二、获取所有路径

2.1 定义测试controller

@RestController
public class DayController{

    @RequestMapping("/day1")
    public String get1(){
        return "day1";
    }

    @RequestMapping("/day2")
    public String get2(){
        return "day2";
    }

}

@RestController
@RequestMapping("/month")
public class MonthController{

    @RequestMapping
    public String get1(){
        return "No1";
    }

    @RequestMapping("/No2")
    public String get2(){
        return "No2";
    }

}

@RestController
@RequestMapping
public class YearController{

    @RequestMapping
    public String get1(){
        return "No1";
    }

    @RequestMapping("/No2")
    public String get2(){
        return "No2";
    }
}

2.2 实现获取所有路径的代码

    private static List<String> urls = new ArrayList<String>();
    @RequestMapping("/get")
    public void get(){
        RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
        Map<RequestMappingInfo, HandlerMethod> handlerMethods = mapping.getHandlerMethods();
        handlerMethods.forEach((x,y)->x.getPatternsCondition().getPatterns().forEach(c->urls.add(c)));
        urls.forEach(System.out::println);
    }

结果

/get
/list
/day2
/day1
/month/No2
/month
/No2

/error
/error

三、通过接口获取实现类的RequestMapping请求路径

3.1 定义一个接口

public interface MyMark {
}

3.2 controller实现该接口

@RestController
public class DayController implements MyMark {

    @RequestMapping("/day1")
    public String get1(){
        return "day1";
    }

    @RequestMapping("/day2")
    public String get2(){
        return "day2";
    }

}

@RestController
@RequestMapping("/month")
public class MonthController implements MyMark {

    @RequestMapping
    public String get1(){
        return "No1";
    }

    @RequestMapping("/No2")
    public String get2(){
        return "No2";
    }

}

@RestController
@RequestMapping
public class YearController implements MyMark {

    @RequestMapping
    public String get1(){
        return "No1";
    }

    @RequestMapping("/No2")
    public String get2(){
        return "No2";
    }
}

主要通过反射拿到Class对象,再通过Class对象获取注解的value,再自己拼接路径

private static List<String> urls = new ArrayList<String>();

@RequestMapping("/list")
    public void list(){

        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();

        Map<String, MyMark> beansOfType = applicationContext.getBeansOfType(MyMark.class);
        for (String key : beansOfType.keySet()) {
            Method[] methods = beansOfType.get(key).getClass().getMethods();
            RequestMapping requestMapping = beansOfType.get(key).getClass().getAnnotation(RequestMapping.class);
            if(requestMapping!=null&&requestMapping.value().length!=0){
                String[] value1 = requestMapping.value();
                for (String s1 : value1) {
                    for (Method method : methods) {
                        RequestMapping annotation = method.getAnnotation(RequestMapping.class);
                        if(annotation!=null){
                            String[] value = annotation.value();
                            for (String s : value) {
                                urls.add(s1+s);
                            }
                        }
                    }
                }
            }else{
                for (Method method : methods) {
                    RequestMapping annotation = method.getAnnotation(RequestMapping.class);
                    if(annotation!=null){
                        String[] value = annotation.value();
                        for (String s : value) {
                            urls.add(s);
                        }
                    }
                }
            }
        }
        urls.forEach(System.out::println);
    }

结果

/day1
/day2
/month/No2
/No2

猜你喜欢

转载自blog.csdn.net/qq_34168515/article/details/106414420
今日推荐