《Spring mvc去掉@RequestMapping注解》 试图做的事情,我自己通过修改Spring的源码终于去掉这个配置。我自己搭建的框架时一直追求“习惯约定优于配置”,看看Spring MVC常见的做法如下。
@Controller
@RequestMapping("/User")
public class UserAction {
@Resource
private UserBo userBo;
@RequestMapping("/list/{pageSize}/{pageNo}")
public String list(@PathVariable int pageSize, @PathVariable int pageNo) {
//具体业务代码,省略
}
}
根据我的命名习惯UserAction默认就应该是“/User”,list方法默认也就是"/list",参数也应该按照参数的顺序那样写。所以说@RequestMapping的声明完全是多余的。
我找不到如何通过配置文件来实现自动映射,只好翻看Spring的源码,终于找到了解决办法,修改了两个类:org.springframework.core.annotation.AnnotationUtils和org.springframework.web.bind.annotation.support.HandlerMethodInvoker。修改后的代码见附件。
补充一个类的代码:
package org.springframework.util;
import java.lang.annotation.Annotation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
public class RequestMappingImpl implements RequestMapping {
private final String[] headers;
private final String[] params;
private final RequestMethod[] method;
private final String[] value;
public RequestMappingImpl(String vlaue) {
params = headers = new String[0];
method = new RequestMethod[0];
this.value = new String[] { vlaue };
}
public RequestMappingImpl(String vlaue, RequestMapping requestMapping) {
params = requestMapping.params();
headers = requestMapping.headers();
method = requestMapping.method();
this.value = new String[] { vlaue };
}
@Override
public String[] headers() {
return headers;
}
@Override
public RequestMethod[] method() {
return method;
}
@Override
public String[] params() {
return params;
}
@Override
public String[] value() {
return value;
}
@Override
public Class<? extends Annotation> annotationType() {
return RequestMapping.class;
}
}