职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1060|回复: 8

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

[复制链接]
月上萧萧 发表于 2011-9-2 11:22 | 显示全部楼层 |阅读模式
《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) {   
        //具体业务代码,省略   
    }   
}  

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

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

}
  
修改后的代码.rar (11.5 KB)
下载次数: 101

broken 发表于 2011-9-2 11:22 | 显示全部楼层
过分追求0配置,会影响代码复用的

走就走吧 发表于 2011-9-2 11:22 | 显示全部楼层
gtssgtss 写道
过分追求0配置,会影响代码复用的



+1


yoyo 发表于 2011-9-2 11:22 | 显示全部楼层
gtssgtss 写道
过分追求0配置,会影响代码复用的

可不可以举个例说说看!

fl 发表于 2011-9-2 11:22 | 显示全部楼层
  
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   
}  

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没说他改了以后是可配置还是不可配置,我当是不可配置了

gz-vps 发表于 2011-9-2 11:23 | 显示全部楼层
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   
}  

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!这样比较灵活!遵守规则,就可以少写代码,不遵守也行!

已经来了吗 发表于 2011-9-2 11:23 | 显示全部楼层
http://code.google.com/p/paoding-rose/

hxy 发表于 2011-9-2 11:23 | 显示全部楼层
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
搞定一切

hxy 发表于 2011-9-2 11:23 | 显示全部楼层
tiyi 写道
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
搞定一切

使用这个达不到我想要的0配置效果,每个方法仍然要加上RequestMapping的注解。里面的url倒可以不写了。
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-5 23:13 , Processed in 0.133005 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表