一、自定义一个注解
@Documented
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Hello {String value() ;}
二、获取实体类里属性上的注解值
1、定义一个实体类
@Data
@ToString
public class Student {@Hello(value = "test")private String name;private int age;}
2、拿值
@RequestMapping(value = "testAnnocationField")
public void testAnnocationField() {Class<Student> studentClass = Student.class;try {Field name = DeclaredField("name");name.setAccessible(true);if(name.isAnnotationPresent(Hello.class)){ // 是否有注解Hello annotation = Annotation(Hello.class);String value = annotation.value();System.out.println(value);}} catch (NoSuchFieldException e) {e.printStackTrace();}
}执行结果: test
三、获取方法上的注解值
@RequestMapping(value = "testAnnotation1")
@Hello(value = "test")
public void testAnnotation1() throws NoSuchMethodException {Class<PractiseController> practiseControllerClass = PractiseController.class;Method method = Method("testAnnotation1");if(method.isAnnotationPresent(Hello.class)) { // 判断方法上是否有注解Hello annotation = Annotation(Hello.class);System.out.println(annotation.value());}
}执行结果: test
备注: PractiseController 为类名
四、动态获得方法上的注解值
1、创建yml文件
server:port: 8088
spring:profiles:active: dev
2、获得动态值
@RequestMapping(value = "testAnnotation")
@Hello(value = "${server.port}")
public void testAnnotation() throws NoSuchMethodException {Class<PractiseController> practiseControllerClass = PractiseController.class;Method method = Method("testAnnotation");if(method.isAnnotationPresent(Hello.class)) {Hello annotation = Annotation(Hello.class);System.out.solvePlaceholders(annotation.value()));}
}执行结果: 8088
五、 参数注解,获取登录用户信息较为常用
1、创建登录用户信息处理器,实现解析器 HandlerMethodArgumentResolver 接口
ample.zhujie.annotation.LoginUser;
ity.SysUser;
import MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.t.request.NativeWebRequest;
import org.hod.support.HandlerMethodArgumentResolver;
import org.hod.support.ModelAndViewContainer;@Component
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {// 判断当前用户是否有注解参数 @LoginUser SysUser sysUser@Overridepublic boolean supportsParameter(MethodParameter parameter) {ParameterType().isAssignableFrom(SysUser.class) && parameter.hasParameterAnnotation(LoginUser.class);}@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {// 给注解参数SysUser 赋值,此处作为测试,因此写了死值,实际开发中,可将登录成功后存入session 或者redis中的用户id取出,查询当前登录用户从而赋值SysUser sysUser = new SysUser();sysUser.setId("ghjklyuiohjkhjk");sysUser.setName("testUser");return sysUser;}
}
2、创建参数注解@LoginSysUser
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {String value() default "";}
3、将自定义参数解析器设置到spring的参数解析器集合中
import org.springframework.beans.factory.annotation.Autowired;
import t.annotation.Configuration;
import org.hod.support.HandlerMethodArgumentResolver;
import org.springframework.fig.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class LoginUserConfigurer implements WebMvcConfigurer {@Autowiredprivate LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(loginUserHandlerMethodArgumentResolver);}
}
4、测试
@RequestMapping(value = "/testLoginUser")
@ResponseBody
public String getPort(@LoginUser SysUser sysUser){System.out.println(sysUser);return null;
}结果: SysUser(name=testUser, id=ghjklyuiohjkhjk)
本文发布于:2024-02-02 03:30:25,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681686941088.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |