• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

java SpringBoot自定义注解,及自定义解析器实现对象自动注入操作

springboot 搞代码 4年前 (2022-01-09) 17次浏览 已收录 0个评论

# java-SpringBoot自定义参数解析器实现对象自动注入

解析器逻辑流程图表

后台解析注解的解析器

首先,我在java后台编写了一个解析器,代码如下

import com.ruoyi.framework.interceptor.annotation.LoginUser;
import com.ruoyi.project.WebMoudle.WebUser.domain.WebUser;
import com.ruoyi.project.WebMoudle.WebUser.service.IWebUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * 有@LoginUser注解的controller方法会进入到解析器中
 * 通过解析器查询到当前用户,并返回给controller *
 * @author yangz
 */
@Service
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

 //用户service
  @Autowired
  private IWebUserService webUserService;

  @Override
  public boolean supportsParameter(MethodParameter parameter) {
    return parameter.getParameterType().isAssignableFrom(WebUser.class) && parameter.hasParameterAnnotation(LoginUser.class);
  }

  @Override
  public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                 NativeWebRequest request, WebDataBinderFactory factory) throws Exception {
    //从request作用域中获取登录时存入的用户ID,不明白的可以查看我的博客springBoot拦截器一文
    Object object = request.getAttribute(AuthorizationInterceptor.LOGIN_USER_KEY, RequestAttributes.SCOPE_REQUEST);
    if (object == null) {
      return null;
    }

    //获取用户信息
    Long userId=(Long) object;
    WebUser user = webUserService.selectWebUserById(userId);
    return user;
  }
}

其次,我编写一个拦截器配置类,将拦截器注入到spring容器中

import com.ruoyi.framework.interceptor.LoginUserHandlerMethodArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.List;

@Configuration
public class LoginUserConfig extends WebMvcConfigurerAdapter {


    /**
   * 此处获取拦截器实例化对象,同理拦截器
   * @return
   */
  @Bean
  public LoginUserHandlerMethodArgumentResolver getLoginUserHandlerMethodArgumentResolver(){
    return new LoginUserHandlerMethodArgumentResolver();
  }

  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){
    super.addArgumentResolvers(argumentResolvers);
    argumentResolvers.add(getLoginUserHandlerMethodArgumentResolver());
  }
}

最后是我们的开关,也就是自定义的注解LoginUser注解,当在controller方法中参数有使用此注解,就会触发我们的解析器进行对象注入,那么我就得自己定义一个属于自己的注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注入用户信息注解,
 *比较简单,没有声明更多的属性
 * @author lipengjun
 * @email [email protected]
 <a>本文来源gao($daima.com搞@代@#码8网^</a>* @date 2017-03-23 20:39
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {

}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java SpringBoot自定义注解,及自定义解析器实现对象自动注入操作
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址