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);
}