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>对象即可!
- SpringMVC 通过注解进行参数注入
- SpringMvc通过自定义注解在方法的参数中注入数据
- 采用注解进行注入
- SpringMVC 参数注入
- SpringMVC参数注入方式
- springMVC model类注解注入
- springMVC参数注解
- SpringMVC参数绑定注解
- SpringMVC参数绑定注解
- springMVC参数绑定注解
- 【SpringMVC】参数绑定注解
- SpringMVC注入参数时为什么必须要在注解中写变量名
- spring利用注解进行注入
- 通过注解约束参数
- SpringMVC中的注入参数问题
- springmvc 通过注解读取配置文件
- 3 手写实现SpringMVC,第三节:通过反射给属性和参数注入值
- 通过实现HandlerMethodArgumentResolver接口,给springMvc的Controller的方法注入自定义参数
- 学习J2ME需要掌握的七种技术
- Android面试题
- 设计模式——装饰者模式
- getFragmentManager与getChildFragmentManager
- Java Generics Quick Tutorial
- SpringMVC 通过注解进行参数注入
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
- CAShapeLayer的简介以及基本使用
- 大家交流
- 修改Linux kernel中打印的级别
- 正则表达式的贪婪与懒惰模式
- 8皇后问题
- Dynamic CDN,让网站飞起来。
- struts2之实现原理