当前位置:主页 > 查看内容

SpringBoot自定义注解属性支持占位符$「x」

发布时间:2021-05-25 00:00| 位朋友查看

简介:环境:SpringBoot2.3.8.RELEASE + JDK1.8 本文教你如何在SpringBoot环境下使得自定义的注解能够使用${xxx}表达式。 相关依赖 dependency groupIdorg.aspectj/groupId artifactIdaspectjrt/artifactId /dependency dependency groupIdorg.aspectj/groupId art……

环境:SpringBoot2.3.8.RELEASE + JDK1.8

本文教你如何在SpringBoot环境下使得自定义的注解能够使用${xxx}表达式。

相关依赖

  1. <dependency> 
  2.             <groupId>org.aspectj</groupId> 
  3.             <artifactId>aspectjrt</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.             <groupId>org.aspectj</groupId> 
  7.             <artifactId>aspectjweaver</artifactId> 
  8.             <scope>runtime</scope> 
  9. </dependency> 

自定义注解

  1. @Retention(RetentionPolicy.RUNTIME) 
  2. @Target(ElementType.METHOD) 
  3. @Documented 
  4. public @interface Manufactur { 
  5.     String value() default "" ; // 厂商编号 

AOP

需要AOP在方法执行器对方法上的注解进行解析处理,获取占位符对应的值

  1. @Component 
  2. @Aspect 
  3. public class ManufacturAspect implements EnvironmentAware { 
  4.      
  5.     private static final Logger logger = LoggerFactory.getLogger(ManufacturAspect.class) ; 
  6.      
  7.     private Environment environment; 
  8.      
  9.     @Pointcut("@annotation(com.pack.annotation.Manufactur)"
  10.     private void info() {} 
  11.      
  12.     @Before("info()"
  13.     public void execBefore(JoinPoint jp) { 
  14.         MethodSignature sign = (MethodSignature) jp.getSignature() ; 
  15.         Method method = sign.getMethod() ; 
  16.         Manufactur manu = method.getAnnotation(Manufactur.class) ; 
  17.         String value = manu.value() ; 
  18.         logger.info("获取到注解值:{}", value) ; 
  19.         BusinessService.code.set(this.environment.resolvePlaceholders(value)) ; 
  20.     } 
  21.  
  22.     @Override 
  23.     public void setEnvironment(Environment environment) { 
  24.         this.environment = environment ; 
  25.     } 
  26.      

该类实现了EnvironmentAware 用于获取Environment对象,该对象能够获取当前环境下的所有相关配置信息。同时通过该类的resolvePlaceholders方法能够解析占位符对应的内容值。

Service中使用

  1. @Service 
  2. public class BusinessService { 
  3.      
  4.     public static ThreadLocal<String> code = new ThreadLocal<String>() ; 
  5.      
  6.     private static Logger logger = LoggerFactory.getLogger(BusinessService.class) ; 
  7.      
  8.     @Manufactur("${manufactur.code}-#{1 + 3}"
  9.     public String invoke(String id) { 
  10.         String sno = code.get() ; 
  11.         logger.info("自定义注解动态获取属性值:{}", sno) ; 
  12.         // todo 
  13.         return sno ; 
  14.     } 
  15.      

在AOP中将解析后的值已经存入到了ThreadLocal中。

测试

  1. @RestController 
  2. @RequestMapping("/business"
  3. public class BusinessController { 
  4.      
  5.     @Resource 
  6.     private BusinessService bs ; 
  7.      
  8.     @GetMapping("/{id}"
  9.     public Object home(@PathVariable String id) { 
  10.         return bs.invoke(id) ; 
  11.     } 
  12.      

 

到此一个自定义注解中支持占位符就完成了,还是非常简单的。


本文转载自网络,原文链接:https://www.toutiao.com/i6930813455414936078/
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐