我是如何把自定義註解應用到生產的
阿新 • • 發佈:2018-12-12
最近自己寫了一個關於閘道器限流的外掛,為了實現限流時的靈活性所以選擇了使用自定義註解,但是在百度了很多篇文章時發現大部分的答案是使用反射,一部分是使用註解處理器。個人感覺這樣實現都不是很合適,感興趣的兄弟可以看一下我是如何使用的。
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 { } |