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

网友投稿 298 2023-03-25

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

# 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.supportIEjhEtrIw.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 arghttp://umentResolvers){

super.addArgumentResolvers(argumentResolvers);

argumentResolvers.add(getLoginUserHandlerMethodArgumentResolver());

}

}

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

import java.lang.annotation.ElementType;

import java.lang.annotation.IEjhEtrIwRetention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 注入用户信息注解,

*比较简单,没有声明更多的属性

* @author lipengjun

* @email 939961241@qq.com

* @date 2017-03-23 20:39

*/

@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

public @interface LoginUseIEjhEtrIwr {

}

然后就是一小个演示使用的方法

@RequestMapping(value = "/prepay")

@ResponseBody

public Map prepay(@LoginUser WebUser webUser){

//此间,从request中获取到userId信息就会在进入controller之前将webuser对象查出并注入到webUser参数中

}

补充知识:Springboot基于自定义注解的自动装配

1.定义java bean

@Data //lombok注解

public class User {

private Integer userId;

private String userName;

}

2.创建configuration类

public class UserConfig {

@Bean

public User getUser(){

User user = new User();

user.setUserId(1);

user.setUserName("你好啊 哈哈哈哈");

return user;

}

}

3.定义注解

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import(UserConfig.class)

public @interface EnableAutoImport {

}

4.调用

@SpringBootApplication

@EnableAutoImport //打上你自定义的注解

public class DemoApplication implements InitializingBean {

//这里实现了InitializingBean 在初始化bean的时候都会执行afterPropertiesSet

@Autowired

private User user; //注入 user类

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

@Override

public void afterPropertiesSet() throws Exception {

//在这里调用了装配进来的类

System.out.println(user.getUserName());

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:火车车次查询 (火车车次查询表)(41秒之前已更新)
下一篇:基于Maven骨架创建JavaWeb项目过程解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~