SpringMVC 通过注解进行参数注入

来源:互联网 发布:嵌入式linux打开图片 编辑:程序博客网 时间:2024/05/21 07:59

           使用SpringMVC已经有好长一段时间,SpringMVC最独特的方法莫过于对参数的封装进行注入(在方法上面直接写参数进行自动注入),但是一直没深入到里面了解其细节,最近在一个项目中看到java注解结合SpringMVC对参数进行注入,感觉特别不错。

        众所周知,在方法中能对基本数据类型,Http对象,对象类型进行封装。这个过程是如何实现的呢?SpringMVC3.0提供HandlerMethodArgumentResolver这个接口。通过Spring调用该接口,在controller中对参数进行拼装。

     HandlerMethodArgumentResolver的实现类有很多,既然他是接口,它的实现类很多:

常用的该接口实现类有:

ServletModelAttributeMethodProcessor:实体类的组装用它实现。

RequestParamMethodArgumentResolver:基本数据类型如String用它实现。

这个说明SpringMVC这个框架对它进行的实现,也可以直接实现,本文章就是讲解如何继承该类对数据进行封装成我们想要的类型的。


完成这一进程需要三个操作结合:

1.书写注解接口

                  

import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Documented  @Target({ElementType.PARAMETER})  @Retention(RetentionPolicy.RUNTIME)  public @interface CurrentUser { String getValue() default "feng"; }  

@Documented  @Target({ElementType.PARAMETER})  @Retention(RetentionPolicy.RUNTIME) public @interface CurrentGood {

           这里我写了2个注解类,分别是当前用户和当前商品类,商品用户里面有个属性默认值是feng。关于注解的作用,举一个例子:http://www.apkbus.com/android-138762-1-1.html,注解作用:1.起到表示  2.通过反射获取注解类上绑定的数据


2.完成HandlerMethodArgumentResolver的实现

         

import org.springframework.core.MethodParameter;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;public class CurrentUserHandlerMethodArgumentResolver implements  HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {if(parameter.hasParameterAnnotation(CurrentUser.class)) {System.out.println("sss");return true;}return false;}@Overridepublic Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer, NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception {CurrentUser currentUserAnnotation = parameter.getParameterAnnotation(CurrentUser.class);System.out.println(currentUserAnnotation.getValue());return 8;}}


import org.springframework.core.MethodParameter;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;public class CurrentGoodsHandlerMethodArgumentResolver implements  HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {if(parameter.hasParameterAnnotation(CurrentGood.class)) {System.out.println("sss");return true;}return false;}@Overridepublic Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer, NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception {CurrentGood parameterAnnotation = parameter.getParameterAnnotation(CurrentGood.class);System.out.println(parameterAnnotation);return 8;}}

            同样,HandlerMethodArgumentResolver的实现我也写了两个,关于这个类里面的2个方法在后面说明.


3.在SpringMVC的配置文件进行配置

          

<mvc:annotation-driven>      <mvc:argument-resolvers>  <bean class="com.keweisoft.kdp.web.annotation.CurrentUserHandlerMethodArgumentResolver" /><bean class="com.keweisoft.kdp.web.annotation.CurrentGoodsHandlerMethodArgumentResolver"></bean>      </mvc:argument-resolvers>  </mvc:annotation-driven> 
                      该配置要放在SpringMVC配置文件 <mvc:annotation-driven /> 上面,才能生效。

/-------------------------------------------------------Controller-----------------------------------------------------------------------------------------------/

@Controller@RequestMapping("/myTest")public class TestController extends BaseController {@RequestMapping("/forward")public String testForawrd(@CurrentUser Integer id, @CurrentGood String name) {System.out.println("aaaaaa");return "index";}    @RequestMapping("/user")public String testUser(@CurrentUser Integer id) {System.out.println("aaaaaa");return "index";}@RequestMapping("/good")public String testUser(@CurrentGood String name) {System.out.println("aaaaaa");return "index";}}

这个是Controller里面有三个方法。

1、先说/myTest/user 这个mapper映射:

               当访问这个映射的时候,会依次执行SpringMVC配置文件中的这两个Bean。

    <mvc:argument-resolvers>  <bean class="com.keweisoft.kdp.web.annotation.CurrentUserHandlerMethodArgumentResolver" /><bean class="com.keweisoft.kdp.web.annotation.CurrentGoodsHandlerMethodArgumentResolver"></bean>      </mvc:argument-resolvers>  

           先执行suportParameter这个方法,若返回false则执行执行testUser中的这个方法,此时参数值是不会封装进去的。若返回true,则回则这个类个的resolveArgument这个方法,返回的值会赋值给testUser中的这个参数。

        

2、/myTest/good 

      同上一样,会依次执行SpringMVC配置文件中的这两个Bean。


3、/myTest/forward

      没一个@注解就会读取bean里面的方法,因此会调用四次这个Bean。



总结:若Controller中需要接受的类型是List<User>

    则在resolveArgument这个方法中返回一个List<User>对象即可!










0 0
原创粉丝点击