Spring 春天的忠告

Spring 春天的忠告,spring,Spring,如果业务方法正在捕获未重新抛出的异常,是否会调用抛出建议?如果该建议应用于业务方法,则不会调用抛出建议,因为它无法看到异常 如果您想“拥有蛋糕(或例外)并吃掉它”,请将业务逻辑分离到另一个方法中。e、 g public void myBusinessLogic() { try { myBusinessLogicImpl(); } catch (BusinessLogicException ex) { } } 然后,您可以向myBusinessLogicIm

如果业务方法正在捕获未重新抛出的异常,是否会调用抛出建议?

如果该建议应用于业务方法,则不会调用抛出建议,因为它无法看到异常

如果您想“拥有蛋糕(或例外)并吃掉它”,请将业务逻辑分离到另一个方法中。e、 g

public void myBusinessLogic()
{
  try
  {
     myBusinessLogicImpl();  
  }
  catch (BusinessLogicException ex)
  {
  }
}
然后,您可以向
myBusinessLogicImpl()
方法添加抛出建议,并吞咽异常

如果使用SpringAOP(大多数情况下),将不会调用aspect。基本上,代码如下所示:

商业方法:

public void businessMethod() {
  try {
    doSomething();
  } catch(BusinessException e) {
    //handle and not rethrow
  }
方面:

try {
  businessMethod();
} catch(BusinessException e) {
  //Aspect advice
}
正如您所看到的,aspect无法“看到”异常。如果您确实希望拦截
BusinessException
,即使它没有从
businessMethod()
中逃逸,纯AspectJ而不是Spring AOP可能会起到作用。它与Spring很好地集成,但是需要首先执行一些核心步骤(编译时或加载时编织)