Spring AspectJ建议方法没有被执行

时间:2018-03-10 08:05:11

标签: aspectj spring-aop

我编写了代码来配置bean方法的各个方面,但建议  方法没有被调用。当我从页面控制器调用OnlineFormSubmissionServices.processOnlineFormSubmission()函数时,我希望看到我的MailingAspect类中给出的日志被记录。但没有一个建议被称为。 我已经定义了一个@Aspect MailingAspect类

@Aspect
public class MailingAspect {
  @Before("execution(* com.modules.onlineforms.services.OnlineFormSubmissionServices.insertOnlineForm(..))")
  public void beforeMail(JoinPoint joinPoint) { // the pointcut signature
    log.error("beforeMail() is running!");
    log.error("hijacked : " + joinPoint.getSignature().getName());
    log.error("******");
  }

  @Before("execution(* com.modules.onlineforms.services.OnlineFormSubmissionServices.createEmail(..)) && args(yourString,..)")
  public void mailAfterReturning(JoinPoint joinPoint, String yourString) {
    // result should be in this format
    log.error("mailAfterReturning() is running!");
    log.error("hijacked : " + joinPoint.getSignature().getName());
    log.error("Method returned value is : " + yourString);
    log.error("******");
  }

  @After("execution(* com.modules.onlineforms.services.OnlineFormSubmissionServices.insertOnlineForm(..))")
  public void mailAfter(JoinPoint joinPoint) {
    System.out.println("mailAfter() is running!");
    System.out.println("hijacked : " + joinPoint.getSignature().getName());
    System.out.println("******");
  }
}

我的bean OnlineFormSubmissionServices如下

public class OnlineFormSubmissionServices  {
  public String processOnlineFormSubmission(HttpServletRequest request, int publicationId){
    String strReturnVal = "";
    strReturnVal = insertOnlineForm(request, publicationId);
    if(strReturnVal.contains("success~")){
      createEmail(strReturnVal); // this is an Aspects method
    }
    return strReturnVal;
  }

  // ...
  public String insertOnlineForm(param1, param2){
  }
  public String createEmail(String sParam){
    log.error("createEmail "+sParam);
    return sParam;
  }
}

我的bean配置如下

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
  @Bean
  public OnlineFormSubmissionServices onlineFormSubmissionServices() {
    OnlineFormSubmissionServices onlineFormSubmissionServices = new OnlineFormSubmissionServices();
    log.error("Inside  OnlineFormSubmissionServices initialization ");
    return onlineFormSubmissionServices;
  }

  @Bean
  //Aspect
  public MailingAspect mailingAspect() {
    MailingAspect mailingAspect = new MailingAspect();
    log.error("Inside MailingAspect initialization ");
    return mailingAspect;
  }
}

有人可以告诉我我做错了吗

1 个答案:

答案 0 :(得分:0)

我必须猜测你真正想问的是什么:

  • 如果你想知道为什么方法processOnlineFormSubmission(..) - 你在问题中分享的唯一方法 - 没有截获,答案很简单:因为你的方面有三个切入点拦截其他方法。 / p>

  • 如果您想知道为什么方法insertOnlineForm(..)createEmail(..)在内部调用时没有被拦截(而不是从另一个bean或组件调用),这只是因为有充分记录的事实,Spring AOP是基于代理的,因此cannot intercept self-invocation。这个问题已经被问过100x了。显然,现在没有人再对RTFM感到烦恼了。还请注意,对于Spring AOP工作,截获的方法也不能是私有的。而BTW,AspectJ没有这样的限制。您可以找到有关如何配置Spring以使用它的说明here