论坛首页 Java企业应用论坛

通过修改Spring的源码,String MVC 0配置又进了一步

浏览 7491 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-30   最后修改:2011-02-18

《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;
	}

}
 
   发表时间:2010-12-30  
过分追求0配置,会影响代码复用的
0 请登录后投票
   发表时间:2010-12-30  
gtssgtss 写道
过分追求0配置,会影响代码复用的



+1
0 请登录后投票
   发表时间:2010-12-31  
gtssgtss 写道
过分追求0配置,会影响代码复用的

可不可以举个例说说看!
0 请登录后投票
   发表时间:2010-12-31  
public abstract class ControllerTemplate extends BaseController {

	//@RequestMapping()0配置
	public ModelAndView maybeAGoodName(Object value){
		//To do something;
	}
}

@Controller
//@RequestMapping0配置,没问题
public class A extends ControllerTemplate {
	//maybeAGoodName 不错,不用改了
}

@Controller
//@RequestMapping0配置,没问题
public class B extends ControllerTemplate {
	//maybeAGoodName 想换个名字,哦0配置了,只好继续maybeAGoodName,或者加个方法,调用maybeAGoodName 
}


lz没说他改了以后是可配置还是不可配置,我当是不可配置了
0 请登录后投票
   发表时间:2010-12-31  
gtssgtss 写道
public abstract class ControllerTemplate extends BaseController {

	//@RequestMapping()0配置
	public ModelAndView maybeAGoodName(Object value){
		//To do something;
	}
}

@Controller
//@RequestMapping0配置,没问题
public class A extends ControllerTemplate {
	//maybeAGoodName 不错,不用改了
}

@Controller
//@RequestMapping0配置,没问题
public class B extends ControllerTemplate {
	//maybeAGoodName 想换个名字,哦0配置了,只好继续maybeAGoodName,或者加个方法,调用maybeAGoodName 
}


lz没说他改了以后是可配置还是不可配置,我当是不可配置了

楼主昨天给我说过是可以配置的,原理大概是这样的!如果没有就(按一定规则)动态生成一个RequestMapping,如果已经配置了 就用当前配置好的RequestMapping!这样比较灵活!遵守规则,就可以少写代码,不遵守也行!
0 请登录后投票
   发表时间:2010-12-31  
http://code.google.com/p/paoding-rose/
0 请登录后投票
   发表时间:2011-01-30  
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
搞定一切
0 请登录后投票
   发表时间:2011-05-23  
tiyi 写道
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
搞定一切

使用这个达不到我想要的0配置效果,每个方法仍然要加上RequestMapping的注解。里面的url倒可以不写了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics