Aspectj中@args使用誤解
阿新 • • 發佈:2019-02-09
剛剛開始觸AOP,什麼都不懂就要做東西。在網上看例子,發現別人在切面類上用@annotation加自定義註解就可以攔截使用這個註解的方法。後來看到還有個@args,就以為可以自定義一個引數註解,在方法的引數上使用這個註解後切面可以攔截有這個引數的方法。由是寫下如下的程式碼:
CheckPara.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CheckPara {
public int sub() default 0;
}
UserService.java
SubParaHandler.java@Service("userService") public class UserService { public void addUser(@CheckPara int age) { System.out.println("age: " + age); } }
@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。。