Spring:通知(Advice)

通知的分类:

前置通知(MethodBeforeAdvice)、后置通知(AfterReturningAdvice)、环绕通知(MethodInterceptor)、异常通知(ThrowsAdvice)


我们先定义一个接口:ISomeInterface

public interface ISomeInterface {

String doFirst();

void doSecond();

}

我们再定义接口的实现类SomeService:

public class SomeService implements ISomeInterface {

@Override

public String doFirst() {

System.out.println("执行doFirst方法!!!");

return "aynu";

}

@Override

public void doSecond() {

System.out.println("执行doSecond方法!!!");

}

}


一、前置通知:

Spring:通知(Advice)

前置通知类

Spring:通知(Advice)

容器配置

Spring:通知(Advice)

测试类

Spring:通知(Advice)

结果


二、后置通知:

Spring:通知(Advice)

后置通知

Spring:通知(Advice)

结果


三、环绕通知:

Spring:通知(Advice)

环绕通知

Spring:通知(Advice)

结果


四、异常通知:

Spring:通知(Advice)

异常通知

其实实现这个接口刚打开时里面是没有任何方法的,那这个方法我们可以打开源码,发现里面定义了这样几个方法

Spring:通知(Advice)

我们选用其中一个,把其复制粘贴过来就行。

五、异常通知的典型应用:

异常通知里可以放异常类,执行相应的异常信息。

Spring:通知(Advice)

异常类

Spring:通知(Advice)

用户名错误异常

Spring:通知(Advice)

密码错误异常

接口:boolean chekUser(String username,String password) throws UserException;

Spring:通知(Advice)

接口实现类

Spring:通知(Advice)

异常通知类

异常通知类前两个里面放的相应的异常类,如果有相应的异常则执行,异常不属于这两类则执行第三个异常信息。

Spring:通知(Advice)

结果


六、为目标方法织入多个切面:

Spring:通知(Advice)

因为interceptorNames是一个数组。


七、使用CGLB动态代理:

我们知道JDK的Proxy用于有接口的,而CGLB用于没接口的,如果我们的项目没有接口,系统默认(自动)使用CGLB动态代理,如果我们有接口,可以通过以下设置使用CGLB动态代理(在工厂里):

Spring:通知(Advice)