Java自定义注解的实现
Java 自定义注解的实现, 总共三步 (eg.@RandomlyThrowsException):
1. 首先编写一个自定义注解 @RandomlyThrowsException
1 2 3 4 5 6 7 8 9 10 11 | package com.github.prontera; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention (RetentionPolicy.RUNTIME) @Target ({ElementType.METHOD}) public @interface RandomlyThrowsException { } |
2. 编写自定义注解 @RandomlyThrowsException 的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.github.prontera.aspect; import com.github.prontera.config.ManualExceptionProperties; import com.github.prontera.exception.ManualException; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.Ordered; import java.security.SecureRandom; import java.util.Random; @Aspect public class ManualExceptionAspect implements Ordered { private final int order; private final ManualExceptionProperties properties; private static final Random RANDOM = new SecureRandom(); public ManualExceptionAspect( int order, ManualExceptionProperties properties) { this .order = order; this .properties = properties; } @Around ( "@annotation(com.github.prontera.RandomlyThrowsException)" ) public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable { if (properties.isEnabled()) { if (RANDOM.nextInt( 100 ) % properties.getFactor() == 0 ) { throw new ManualException( "manual exception" ); } } return joinPoint.proceed(); } @Override public int getOrder() { return order; } } |
3. 使用自定义注解 @RandomlyThrowsException
1 2 3 4 5 6 7 | @Delay @RandomlyThrowsException @ApiOperation (value = "下单" , notes = "生成预订单" ) @RequestMapping (value = "/orders" , method = RequestMethod.POST) public ObjectDataResponse<Order> placeOrder( @Valid @RequestBody PlaceOrderRequest request, BindingResult result) { return orderService.placeOrder(request); } |