天天看點

利用AOP擷取自定義标簽的參數以及方法的參數

在放假之前就一直在解決這個問題,當時采用的方法的是利用攔截器對自定義的标簽進行攔截。采用的是下邊的方法。

Method method = invocation.getMethod();
MetaCacheable metaCacheable = method.getAnnotation(MetaCacheable.class);
String cacheName = KeyInfo.getFromMetaCacheable(metaCacheable).getValue();
String keys = KeyInfo.getFromMetaCacheable(metaCacheable).getKey();
           

但是這種方法存在一個問題,就是隻能擷取到自定義标簽的内容而無法擷取到方法中的參數。上邊的例子中定義了一個MetaCache标簽,通過MethodInvocation的執行個體擷取到攔截到的方法的名字,進一步通過getAnnotation方法擷取到标簽的内容,下邊是标簽的定義

@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented


public @interface MetaCacheable {
	String value();
	String key() default "";
	String keyGenerator() default "";
}
           

在sum(int a,int b)方法上添加的是MetaCahceable(key ="name",value="cacheName"),通過攔截器隻能夠擷取到引号中的内容也就是name,而無法擷取到方法中的a的值,這是一個很頭疼的問題,因為在使用标簽的時候通常需要擷取到參數的值。但是攔截器好像無法做到,這我一個值得反思的地方,一直想用攔截器擷取到方法中參數的值,但是查了各種資料也沒有解決最終浪費了大量的時間。其實在一開始的時候就有建議去利用AOP做,而自己卻一直堅持自己的想法。工程性的問題一方面是要有性能上的考慮,另一方法也得有時間上的考慮,很明顯因為無謂的堅持導緻了大量時間的浪費,這是一個教訓。

下邊看一下利用AOP來做這件事情,同樣定義了上邊l類似的Cacheable的标簽,然後在切面上做這件事情。

MethodSignature signature = (MethodSignature) thisJoinPoint.getSignature();
Cacheable cacheable = signature.getMethod().getAnnotation(Cacheable.class);
String cacheName = cacheable.cacheName();
           

采用這種方法就可以擷取到攔截器已經擷取到的引号中的内容。

@Pointcut("execution(@Cacheable * *.*(..))")
@SuppressWarnings("unused")
	private void cache() {
}


@Around("cache()")
public Object aroundCachedMethods(ProceedingJoinPoint thisJoinPoint)throws Throwable {
	for (final Object arg : thisJoinPoint.getArgs()) {
		//增加參數的類型和值
		keyBuffer.append("arg");
	}
}
           

采用上邊的方法就能擷取方法中的參數,這個标簽中的參數和方法中的參數了。