前面定義的advice都是直接植入到代理接口的執行之前和之后,或者在異常發生時,事實上,還可以對植入的時機定義的更細。
Pointcut定義了advice的應用時機,在Spring中pointcutAdvisor將pointcut和advice結合成一個對象,spring內建的pointcut都對應着pointcutAdvisor,常見的有下面兩種:
NameMatchMethodPointcutAdvisor:他是最基本的pointcutAdvisor,是靜態pointcut的實例,你可以指定advice所要應用的目標方法名稱,或者用*來指定。例如 hello* 代表以hello開頭的所有方法名稱,都要應用到指定的advice上。
RegExpMethodPointcutAdvisor:可以讓你用正則表達式的方式來定義pointcut,他是靜態pointcut實例,在符合正則表達式的情況下,應用到指定的advice上。其中,bean中有一個pattern屬性,用於寫入正則表達式
public interface IHello { public void sayHello(String str) throws Exception; public void sayHelloChina(String str); public void sayHelloEnglish(String str); } public class Hello implements IHello { @Override public void sayHello(String str) throws Exception { System.out.println("你好"+str); //測試拋出異常 throw new Exception("故意造成異常!"); } @Override public void sayHelloChina(String str) { System.out.println("你好"+str); } @Override public void sayHelloEnglish(String str) { System.out.println("Hello"+str); } }
hello.sayHelloChina("中國");
hello.sayHelloEnglish("美國");