我编写了代码来配置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;
}
}
有人可以告诉我我做错了吗
答案 0 :(得分:0)
我必须猜测你真正想问的是什么:
如果你想知道为什么方法processOnlineFormSubmission(..)
- 你在问题中分享的唯一方法 - 没有截获,答案很简单:因为你的方面有三个切入点拦截其他方法。 / p>
如果您想知道为什么方法insertOnlineForm(..)
和createEmail(..)
在内部调用时没有被拦截(而不是从另一个bean或组件调用),这只是因为有充分记录的事实,Spring AOP是基于代理的,因此cannot intercept self-invocation。这个问题已经被问过100x了。显然,现在没有人再对RTFM感到烦恼了。还请注意,对于Spring AOP工作,截获的方法也不能是私有的。而BTW,AspectJ没有这样的限制。您可以找到有关如何配置Spring以使用它的说明here。