-
前置通知(Before advice)
:在某连接点之前执行的通知,但这个通知不能阻止连接点之前的执行流程(除非它抛出一个异常)。 -
后置通知(After returning advice)
:在某连接点正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 -
异常通知(After throwing advice)
:在方法抛出异常退出时执行的通知。 -
最终通知(After (finally) advice)
:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 -
环绕通知(Around Advice)
:包围一个连接点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。
1、环绕通知:
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、前置通知:
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、
后置通知:
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抛出的异常,并在抛出异常前执行相应的方法
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:
<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:
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+"正在登录");
}
}