SpringMvc通过自定义注解在方法的参数中注入数据
来源:互联网 发布:淘宝怎么看消费总额 编辑:程序博客网 时间:2024/06/14 10:38
说一个场景,有时候我们做后台业务的时候,经常需要取session中存储的用户信息,所以免不了一直需要写下面这一段又长又无聊的代码:
MemberCommand memberCommand = (MemberCommand) request.getSession().getAttribute(SessionAttr.MEMBER_DETAIL);
那么怎么避免这个事情呢,下面我们就来通过一个自定义注解@MemberDetail和SpringMvc的HandlerMethodArgumentResolver接口来实现这个功能。
首先来创建我们的自定义注解:
/** * * @Description 方法的参数上加了这个注解,会自动注入当前登录用户放在session中的用户对象 * @author chenbin.sun * @date 2017年8月30日上午11:23:02 * */@Documented@Target({ ElementType.PARAMETER })@Retention(RetentionPolicy.RUNTIME)public @interface MemberDetail {}
然后实现HandlerMethodArgumentResolver接口,来写我们的注入逻辑,url请求进来后走完其他一些拦截器等之后会在进入方法之前执行supportsParameter依次传入要请求方法的参数,我们只需要在这里判断这个参数,是否符合我们的要求,是否是我们想要注入的参数就可以了,如果是返回true,否则返回false,如果返回的是true那么他就会执行resolveArgument方法,此时我们只需要把我们要注入的数据return出去就可以了,详情请看下面代码。
/** * @Description 用于方法参数上加MemberDetail标签获取当前登录用户的信息 * @author chenbin.sun * @date 2017年8月30日下午3:50:00 * */ public class MemberDetailHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { /** 登录用户信息session中的key */ private String sessionKey = SessionAttr.MEMBER_DETAIL; /** 登录用户信息的class类型 */ private Class<?> sessionMemberClass = MemberCommand.class; @Override public boolean supportsParameter(MethodParameter parameter) { // 过滤出符合条件的参数,这里指的是加了MemberDetail注解的参数 if (parameter.hasParameterAnnotation(MemberDetail.class)) { return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); // 获取session中存放的用户信息 Object sessionMember = WebUtils.getSessionAttribute(request, sessionKey); if (null == sessionMember){ return null; } // session中对象与加了MemberDetail注解的参数的类型相同是赋值给这个参数 Class<?> klass = parameter.getParameterType(); if (klass.isAssignableFrom(sessionMemberClass)){ return sessionMember; } return null; }}
当然拉,这个实现类需要在xml中配置一下才能生效,下面看真名配置,很简单的。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd "> <mvc:annotation-driven> <mvc:argument-resolvers> <bean class="chenbin.sun.MemberDetailHandlerMethodArgumentResolver"></bean> </mvc:argument-resolvers> </mvc:annotation-driven></beans>
使用的时候只需要像下面这样将注解配置到要注入的参数上,那么请求进来后,如果session中有这个值,那么你的方法上的这个参数就一定是有值的了。
@RequestMapping("/doTest")public String test(@MemberDetail MemberCommand memberCommand){ System.out.println(memberCommand.getName());}
OK,就到这里,个人觉得这个还是挺实用的。
阅读全文
1 0
- SpringMvc通过自定义注解在方法的参数中注入数据
- SpringMVC 通过注解进行参数注入
- 通过实现HandlerMethodArgumentResolver接口,给springMvc的Controller的方法注入自定义参数
- SpringMVC注入参数时为什么必须要在注解中写变量名
- Spring MVC 集成 AOP,自定义注解,在切面获得方法参数,以及自定义注解的参数。
- 通过自定义注解利用AOP在springmvc中实现记录日志
- 在SpringMVC中开启Shiro注解授权的正确方法
- SSH:通过注解(Annotation)的方式在Spring IoC容器中注入依赖
- java在注解中绑定方法参数的解决方案
- 通过注解的方式向DAO中注入Sessionfactory
- 在spring的aop中获取自定义注解的参数值,即在切面中获取annotation的参数值
- 基于注解的spring 在静态方法中使用注入的类
- 使用Spring注解,在静态方法中注入bean
- 关于springmvc中注解@ModelAttribute的bean(对象参数)问题
- SpringMVC中@RequestMapping处理请求参数的@RequestParam注解
- 【Spring】 (1)Aspect 自定义注解 使用该注解的地方 自动注入该注解里传的参数
- SpringMVC中基于AOP的自定义注解记录日志
- Springmvc注解注入的简单demo
- 背景透明文字不透明
- SpringMVC AOP详解
- 【01trie合并】hdu 6191
- Office2016、Project2016以及Visio2016下载、安装及激活心得
- Android如何实现新手指引操作
- SpringMvc通过自定义注解在方法的参数中注入数据
- Material Design整理(七)——Palette调色板
- SQL优化器原理
- 经验分享 |【PDF下载】阿里开源峰会之BeeHive:一种大型iOS项目解耦实践
- Spring security4.1.0 自定义角色和权限
- android中的Log问题
- TCP/IP
- java工程中如何连接redis数据库?
- 读软件工程师的成长有感