寫了一個小程式測試了一下, @Interceptors 他的流程
@Stateless
@Interceptors({AuditInterceptor.class, SecurityInterceptor.class})
public class AuditInterceptor {
@AroundInvoke public Object auditOperation(InvocationContext inv)
throws Exception {
try {
System.out.println("audit "+inv.getMethod().getName());
Object result = inv.proceed();
System.out.println("test after proceed");
return result;
} catch ( Exception ex ) {
throw ex;
} finally {
System.out.println("finally end message");
}
}
}
以及
import javax.interceptor.*;
public class SecurityInterceptor {
@AroundInvoke public Object securitySome(InvocationContext inv)
throws Exception {
try {
System.out.println("security"+inv.getMethod().getName());
Object result = inv.proceed();
System.out.println("test after proceed in security");
return result;
} catch ( Exception ex ) {
throw ex;
} finally {
System.out.println("Final in security");
}
}
}
執行的結果是
audit getHello|#]
securitygetHello|#]
Hello in getHello()|#]
test after proceed in security|#]
Final in security|#]
test after proceed|#]
finally end message|#]
換句話說, 當我們透過 InvocationContext proceed 之後,
會將 process 指到下一個 Interceptor
當沒有下一個 Interceptor 的時候
就會到了 Bean Method() 的操作
等到 Bean Method() 結束之後
才會開始處理 proceed 之後的功能
一直等到你執行 reutnr Object ( inv.proceed() ) .
雖然 return 該 Object ( inv.proceed() ) 之後,
我們也可以利用 finally 來處理最後的相關事務