java 自定义注解 解析器_java SpringBoot如何实现自定义注解及自定义解析器对象自动注入的方法...

java SpringBoot如何实现自定义注解及自定义解析器对象自动注入的方法

发布时间:2020-08-20 09:34:34

来源:亿速云

阅读:450

作者:小新

这篇文章主要介绍java SpringBoot如何实现自定义注解及自定义解析器对象自动注入的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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

解析器逻辑流程图表

37e31fc89fa4688bd39672a40cccc3c3.png

后台解析注解的解析器

首先,我在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 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 939961241@qq.com

* @date 2017-03-23 20:39

*/

@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

public @interface LoginUser {

}

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

@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());

}

}

以上是java SpringBoot如何实现自定义注解及自定义解析器对象自动注入的方法的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java SpringBoot是一种使用了Spring框架的快速开发平台,它采用了自动配置和约定优于配置的原则,简化了Java应用程序的开发。自定义注解是在SpringBoot中扩展功能的一种方式,可以通过自定义注解实现一些特定的业务逻辑,使得代码更加简洁和可读。 自定义注解可以用来标记某个方法、类或者字段,通过在注解中定义一些元数据,来改变注解所标记的元素的行为。在SpringBoot中,我们可以通过自定义注解来简化一些操作,比如对象自动注入。 在使用自定义注解时,我们还需要编写自定义解析器,通过解析器来读取和处理注解,完成对象自动注入操作。自定义解析器需要实现Spring框架的BeanPostProcessor接口,该接口提供了对Bean对象进行处理的扩展点。 在自定义解析器中,我们需要重写接口中的两个方法:postProcessBeforeInitialization和postProcessAfterInitialization。在这两个方法中,我们可以通过反射机制获取到标记了我们自定义注解的类或者字段,然后根据实际的业务需求进行处理。 例如,我们可以定义一个自定义注解@AutoInject,然后编写一个自定义解析器AutoInjectAnnotationBeanPostProcessor,用来实现对象自动注入。在解析器中,我们可以通过反射机制获取到标记了@AutoInject注解的字段,然后使用Spring的依赖注入功能将依赖的对象注入到标记了@AutoInject注解的字段中。 总之,Java SpringBoot自定义注解自定义解析器可以用来实现对象自动注入操作。通过定义注解来标记需要注入的字段,然后通过自定义解析器来读取和处理注解,完成对象自动注入。这样可以减少重复的代码,提高开发效率,并且使得代码更加清晰和可维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值