为什么throwsAdvice对象的类型不是throwsAdvise?作者的评论表明,这似乎是一个有意的设计。我不知道这个奇怪的设计有什么用,也不知道我是否忽略了任何细节。
public class ThrowsAdviceInterceptor implements MethodInterceptor, AfterAdvice {
private final Object throwsAdvice;
/**
* Create a new ThrowsAdviceInterceptor for the given ThrowsAdvice.
* @param throwsAdvice the advice object that defines the exception handler methods
* (usually a {@link org.springframework.aop.ThrowsAdvice} implementation)
*/
public ThrowsAdviceInterceptor(Object throwsAdvice) {
Assert.notNull(throwsAdvice, "Advice must not be null");
this.throwsAdvice = throwsAdvice;
//...
}
}
从我的角度来看,
"处理程序方法(通常一个{@linkorg.springframework.aop.SthrowsAdvice}实现(
通常,但不需要或总是。。。
这意味着对象throwsAdvice不需要具有类型throwsAdvice,但它通常是throwsAdvice。
目标的类型可以是ThrowsAdvice、Object。。。
ThrowsAdviceInterceptor仅在您的目标类至少有一个方法名称以"开头的处理程序时进行验证;after投掷";以及一些参数。。。
public class MyThrowsAdvice(){
public void afterThrowing(Exception ex){...}
}
ThrowsAdviceInterceptor t = new ThrowsAdviceInterceptor(new MyThrowsAdvice());
上面的例子并没有实现ThrowsAdvice,但它仍然对ThrowsAveniceInterceptor有效。
为什么spring团队不选择ThrowAdvice而不是Object。
我认为以上选择将限制ThrowsAdviceInterceptor的使用。(只是我的看法(。
https://github.com/joshlong/spring-framework-1/blob/master/spring-aop/src/main/java/org/springframework/aop/framework/adapter/ThrowsAdviceInterceptor.java