前置通知(Before advice):在某連接點之前執行的通知,但這個通知不能阻止連接點之前的執行流程(除非它拋出一個異常)。
後置通知(After returning advice):在某連接點正常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。
異常通知(After throwing advice):在方法拋出異常退出時執行的通知。
最終通知(After (finally) advice):當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。
環繞通知(Around Advice):包圍一個連接點的通知,如方法調用。這是最強大的一種通知類型。環繞通知可以在方法調用前後完成自定義的行為。它也會選擇是否繼續執行連接點或直接返回它自己的返回值或拋出異常來結束執行。
1、環繞通知:
[java]
public class LogInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
// TODO Auto-generated method stub
System.out.println("aop begin");
Object obj = arg0.proceed();
System.out.println("aop end");
return obj;
}
}
2、前置通知:
[java]
public class BeforInterceptor implements MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("BeforInterceptor");
System.out.println("切入點對象:"+arg2+" 參數:"+arg1[0]+" 切入點:"+arg0.getName());
}
}
3、後置通知:
[java]
public class AfterInterceptor implements AfterReturningAdvice {
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
// TODO Auto-generated method stub
System.out.println(arg0+" "+arg3);
}
}
4、異常通知:
ThrowsAdvice是一個標示接口,我們可以在類中定義一個或多個,來捕獲定義異常通知的bean拋出的異常,並在拋出異常前執行相應的方法
[java] view plaincopy
public class ExceptionInterceptor implements ThrowsAdvice{
public void afterThrowing(Exception e){
System.out.println(e);
System.out.println("ExceptionInterceptor Exception");
}
public void afterThrowing(NullPointerException e){
System.out.println(e);
System.out.println("ExceptionInterceptor NullPointerException");
}
}
異常通知被攔截後就不會執行其它的方法瞭,比如攔截到瞭NullPointerException就不會攔截Exception
xml:
[html]
<aop:config>
<aop:pointcut expression="execution(* org.han.service.*.*(..))"
id="logpoint" />
<!– 環繞通知 –>
<aop:advisor advice-ref="loginter1" pointcut-ref="logpoint"/>
<!– 前置通知 –>
<aop:advisor advice-ref="loginter2" pointcut-ref="logpoint"/>
<!– 後置通知 –>
<aop:advisor advice-ref="loginter3" pointcut-ref="logpoint"/>
<!– 異常通知–>
<aop:advisor advice-ref="loginter4" pointcut-ref="logpoint"/>
</aop:config>
services:
[java ]
public class LoginService {
public void login(){
System.out.println("yyy正在登錄");
User u=null;
System.out.println(u.getUname());
System.out.println("xxx正在登錄");
}
public User register(){
System.out.println("註冊成功");
return new User("han","zhou");
}
public User getUser(String uname,String pwd){
System.out.println("getUser");
return new User(uname,pwd);
}
public void login(String uname){
System.out.println(uname+"正在登錄");
}
}
作者:hanzhou4519