SpringMVC 通过注解进行参数注入

           使用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 {

	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		if(parameter.hasParameterAnnotation(CurrentUser.class)) {
			System.out.println("sss");
			return true;
		}
		return false;
	}

	@Override
	public 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 {

	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		if(parameter.hasParameterAnnotation(CurrentGood.class)) {
			System.out.println("sss");
			return true;
		}
		return false;
	}

	@Override
	public 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>对象即可!










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值