欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring MVC获取所有的controller

程序员文章站 2024-02-13 20:46:34
...

前言

因为springspring mvc 使用的管理容器不同,所以获取bean的方式也就不同
spring 的bean是交由ApplicationContext 管理
spring mvc的bean是交由WebApplicationContext 管理,
所以物品们需要先获取WebApplicationContext,话不多说上代码

第一步获取WebApplicationContext

通过WebApplicationContextUtils 工具类中的public static WebApplicationContext getWebApplicationContext(ServletContext sc) 方法获取WebApplicationContext,所以,想要获取,就必须传入ServletContext对象
获取ServletContext对象可以从FilterConfig,ServletRequest等中获取

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
}

第二步获取带有controller 注解的bean

WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
//获取所有带controller的类
Map<String, Object> controllerBeans = webApplicationContext.getBeansWithAnnotation(Controller.class);
//遍历Map
Iterator<Map.Entry<String, Object>> iterator = controllerBeans.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Object> next = iterator.next();
    //获取controller类
    Object value = next.getValue();
    
    Class<?> controllerClass = value.getClass();
    //判断是否有RequestMapping注解
    RequestMapping controllerAnno = controllerClass.getAnnotation(RequestMapping.class);

    //获取name和path
    String classMappingName=controllerClass.getSimpleName();
    String[] classMappingPaths = {};
    //保存controller类的mapping
    if (controllerAnno!=null) {
        //获取name和path
        classMappingName=controllerAnno.name();
        classMappingPaths = controllerAnno.path();
    }
    //获取所有的方法
    Method[] methods = controllerClass.getMethods();
    for (Method method : methods) {
        RequestMapping methodAnno = method.getAnnotation(RequestMapping.class);
        if (methodAnno!=null) {
            //获取name和path
            String methodMappingName=methodAnno.name();
            String[] methodMappingPaths = methodAnno.path();
        }
    }
}

注意

  1. WebApplicationContext 只能获取ApplicationContext扫描的beanspring mvc 扫描的bean不能获取,如果想获取spring mvc 扫描的bean,就必须保证ApplicationContext扫描了该bean
  2. 因为springspring mvc使用的是两个不同的容器,所以spring扫描spring mvc 扫描的bean不存在重复注入的问题
  3. 如果存在不能获取dao bean时,需要检查mybtis spring中MapperScannerConfigurer中dao层包路径是否正确
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" p:basePackage="正确的dao层包路径"
          p:sqlSessionFactoryBeanName="sqlSessionFactory"/>