1. 程式人生 > >我是如何把自定義註解應用到生產的

我是如何把自定義註解應用到生產的

最近自己寫了一個關於閘道器限流的外掛,為了實現限流時的靈活性所以選擇了使用自定義註解,但是在百度了很多篇文章時發現大部分的答案是使用反射,一部分是使用註解處理器。個人感覺這樣實現都不是很合適,感興趣的兄弟可以看一下我是如何使用的。

1. 如何自定義註解

這個其實網路上的文章太多太多了,我這裡就簡單的說一下

1
2
3
4
5
6
7
@Target(ElementType.TYPE)//ElementType.TYPE表示可以用在類上,ElementType.METHOD表示可以用在方法上
@Retention(RetentionPolicy.RUNTIME)//RetentionPolicy.RUNTIME執行事保留RetentionPolicy.CLASS編譯時保留
@Documented//會被 javadoc 之類的工具處理
@Inherited//表示可以被繼承
public @interface ClassRateLimit {
 
}

2. 通過切面的方式處理註解

我們定義這樣的一個切面來對註解標註的方法或者類來進行處理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Aspect
@Component
public class ClassAnnotationAspect {

    @Pointcut("@within(classRateLimit)")
    public void annotationPointcut(ClassRateLimit classRateLimit) {
    }


    @Before("@within(classRateLimit)")
    public void doBefore(JoinPoint joinPoint, ClassRateLimit classRateLimit) {
    	//classRateLimit 通過這個物件獲取註解中的屬性
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//通過這個物件取得本次請求的方法資訊
            
            Class[] clazz=joinPoint.getClass();//通過這個物件取得本次請求的類資訊
             ServletRequestAttributes requestAttributes = (ServletRequestAttributes) //通過這個物件取得本次請求的request和response資訊
             RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        HttpServletResponse response = requestAttributes.getResponse();
    }
}

3. 如何應用於實踐呢

在1和2的兩個步驟中,我們自定義了一個註解,也給他寫了一個處理方法,如果是我們應用於自己的專案其實已經是沒問題的,只要讓ClassAnnotationAspect類被Spring管理就行了。 但是還有一種場景時,我們的這個註解作為一個jar包,提供給別人用,別人的Spring又不會管理我們jar包裡的bean。這個時候怎麼辦呢? 這時我們就用到了另一個註解@Import,使用這個註解可以引入一個配置類,當我們作為一個第三方jar包存在時想要別人的Spring可以管理到我們的bean的時候,我們可以提供一個統一的配置類,在這個配置類中進行掃包,註冊bean等一系列操作。然後別人只需要引入我們的配置類就ok了。 比如說,我的很多bean,包括剛才說的ClassAnnotationAspect類都在在cn.org.zhixiang包和它的子包下,那麼我就可以新建一個配置類

1
2
3
4
5
@Configuration
@ComponentScan(basePackages="cn.org.zhixiang")
public class EnableSyjRateLimitConfiguration {

}

當別人要使用我提供的服務時只需要這樣引入即可

1
2
3
4
@Import(EnableSyjRateLimitConfiguration.class)
@Configuration
public class SyjRateLimitConfig {
}

4.看看別人是怎麼實現的