spring MVC获取所有的controller
程序员文章站
2024-02-13 20:46:34
...
前言
因为spring
和spring 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();
}
}
}
注意
-
WebApplicationContext
只能获取ApplicationContext
扫描的bean
,spring mvc
扫描的bean
不能获取,如果想获取spring mvc
扫描的bean
,就必须保证ApplicationContext
扫描了该bean
, - 因为
spring
和spring mvc
使用的是两个不同的容器,所以spring
扫描spring mvc
扫描的bean
不存在重复注入的问题 - 如果存在不能获取dao
bean
时,需要检查mybtis
spring中MapperScannerConfigurer
中dao层包路径是否正确
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" p:basePackage="正确的dao层包路径"
p:sqlSessionFactoryBeanName="sqlSessionFactory"/>
上一篇: URI
推荐阅读
-
Spring Boot - 获取所有的Bean信息
-
spring MVC获取所有的controller
-
获取并打印Spring容器中所有的Bean名称
-
spring mvc利用ajax向controller传递对象的方法示例
-
spring mvc中,如何在 Java 代码里,获取 国际化 内容
-
spring mvc中,如何在 Java 代码里,获取 国际化 内容
-
获取spring应用中的所有的配置信息
-
ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面
-
详解Spring MVC如何测试Controller(使用springmvc mock测试)
-
spring boot中controller的使用及url参数的获取方法