文章目录
一、前言 — 灵活使用 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