1. 程式人生 > >Aspectj中@args使用誤解

Aspectj中@args使用誤解

剛剛開始觸AOP,什麼都不懂就要做東西。在網上看例子,發現別人在切面類上用@annotation加自定義註解就可以攔截使用這個註解的方法。後來看到還有個@args,就以為可以自定義一個引數註解,在方法的引數上使用這個註解後切面可以攔截有這個引數的方法。由是寫下如下的程式碼:

CheckPara.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CheckPara {
	public int sub() default 0;
}

UserService.java
@Service("userService")

public class UserService {
	public void addUser(@CheckPara int age)
	{
		System.out.println("age: " + age);
	}
}
SubParaHandler.java
@Component
@Aspect
public class SubAgeHandler {

	@Before("@args(com.zjs.cglib.test.CheckPara)")
	public void subIt() throws Throwable {
		System.out.println("fuck!");
		return;
	}
}

主程式
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext ac = new ClassPathXmlApplicationContext("testBeans.xml");
        UserService us = (UserService) ac.getBean("userService");
        us.addUser(us);
    }
}

執行後發現fuck!沒有被打印出來。百度很久無解,只好開VPN去Google國外搜搜。發現http://stackoverflow.com/questions/20121126/spring-aop-args-advice-refuses-to-run,這哥們和我遇到的問題一樣。

下面有一個回答給了另一個連結http://stackoverflow.com/questions/16810617/aspectj-java-instrumentation-to-intercept-an-annoted-parameter-call-usage,進去之後第一個回答解決了問題。

原來這種寫法AspectJ現在還不支援,是一個wish list上的feature,但還沒有實現。

現在@args的正確用法是,自定義一個ElementType.TYPE的註解,這個註解用來修飾自定義型別(比如自己寫的一個類),一個方法以這個自定義的類的例項為引數且只能有這唯一一引數,那這個方法在呼叫時會被匹配@args(自定義註解)的切面攔截。

這次的教訓是。。真有問題的時候還必須得google。。