java SpringBoot自定义注解,及自定义解析器实现对象自动注入操作
#java-SpringBoot自定义参数解析器实现对象自动注入
解析器逻辑流程图表
后台解析注解的解析器
首先,我在java后台编写了一个解析器,代码如下
importcom.ruoyi.framework.interceptor.annotation.LoginUser;
importcom.ruoyi.project.WebMoudle.WebUser.domain.WebUser;
importcom.ruoyi.project.WebMoudle.WebUser.service.IWebUserService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.core.MethodParameter;
importorg.springframework.stereotype.Service;
importorg.springframework.web.bind.support.WebDataBinderFactory;
importorg.springframework.web.context.request.NativeWebRequest;
importorg.springframework.web.context.request.RequestAttributes;
importorg.springframework.web.method.support.HandlerMethodArgumentResolver;
importorg.springframework.web.method.support.ModelAndViewContainer;
/**
*有@LoginUser注解的controller方法会进入到解析器中
*通过解析器查询到当前用户,并返回给controller*
*@authoryangz
*/
@Service
publicclassLoginUserHandlerMethodArgumentResolverimplementsHandlerMethodArgumentResolver{
//用户service
@Autowired
privateIWebUserServicewebUserService;
@Override
publicbooleansupportsParameter(MethodParameterparameter){
returnparameter.getParameterType().isAssignableFrom(WebUser.class)&¶meter.hasParameterAnnotation(LoginUser.class);
}
@Override
publicObjectresolveArgument(MethodParameterparameter,ModelAndViewContainercontainer,
NativeWebRequestrequest,WebDataBinderFactoryfactory)throwsException{
//从request作用域中获取登录时存入的用户ID,不明白的可以查看我的博客springBoot拦截器一文
Objectobject=request.getAttribute(AuthorizationInterceptor.LOGIN_USER_KEY,RequestAttributes.SCOPE_REQUEST);
if(object==null){
returnnull;
}
//获取用户信息
LonguserId=(Long)object;
WebUseruser=webUserService.selectWebUserById(userId);
returnuser;
}
}
其次,我编写一个拦截器配置类,将拦截器注入到spring容器中
importcom.ruoyi.framework.interceptor.LoginUserHandlerMethodArgumentResolver;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.method.support.HandlerMethodArgumentResolver;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
importjava.util.List;
@Configuration
publicclassLoginUserConfigextendsWebMvcConfigurerAdapter{
/**
*此处获取拦截器实例化对象,同理拦截器
*@return
*/
@Bean
publicLoginUserHandlerMethodArgumentResolvergetLoginUserHandlerMethodArgumentResolver(){
returnnewLoginUserHandlerMethodArgumentResolver();
}
@Override
publicvoidaddArgumentResolvers(ListargumentResolvers){
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(getLoginUserHandlerMethodArgumentResolver());
}
}
最后是我们的开关,也就是自定义的注解LoginUser注解,当在controller方法中参数有使用此注解,就会触发我们的解析器进行对象注入,那么我就得自己定义一个属于自己的注解
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
/**
*注入用户信息注解,
*比较简单,没有声明更多的属性
*@authorlipengjun
*@email939961241@qq.com
*@date2017-03-2320:39
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceLoginUser{
}
然后就是一小个演示使用的方法
@RequestMapping(value="/prepay") @ResponseBody publicMapprepay(@LoginUserWebUserwebUser){ //此间,从request中获取到userId信息就会在进入controller之前将webuser对象查出并注入到webUser参数中 }
补充知识:Springboot基于自定义注解的自动装配
1.定义javabean
@Data//lombok注解
publicclassUser{
privateIntegeruserId;
privateStringuserName;
}
2.创建configuration类
publicclassUserConfig{
@Bean
publicUsergetUser(){
Useruser=newUser();
user.setUserId(1);
user.setUserName("你好啊哈哈哈哈");
returnuser;
}
}
3.定义注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(UserConfig.class)
public@interfaceEnableAutoImport{
}
4.调用
@SpringBootApplication
@EnableAutoImport//打上你自定义的注解
publicclassDemoApplicationimplementsInitializingBean{
//这里实现了InitializingBean在初始化bean的时候都会执行afterPropertiesSet
@Autowired
privateUseruser;//注入user类
publicstaticvoidmain(String[]args){
SpringApplication.run(DemoApplication.class,args);
}
@Override
publicvoidafterPropertiesSet()throwsException{
//在这里调用了装配进来的类
System.out.println(user.getUserName());
}
}
以上这篇javaSpringBoot自定义注解,及自定义解析器实现对象自动注入操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。