AOP Spring @AfterReturning无法按预期工作

我正在学习AOP spring并尝试一些例子。 关于@ AfterReturning,我所理解的是只有在目标成功返回并且与切入点匹配时才调用该方法。 但是在我的情况下如下所示,我有一个切入点,它定义了只返回String的所有方法,但是它调用所有的void方法以及返回String的方法。

我的建议:

@AfterReturning(value= "execution(* com.aop..CustomerServiceImpl.*(..))", returning= "string") public void returnStringPointcut(JoinPoint joinPoint,String string){ System.out.println("logAfter() is running!"); System.out.println("String : " + string); System.out.println("hijacked : " + joinPoint.getSignature().getName()); System.out.println("******"); } 

请在下面找到我的Impl课程:

 public void addCustomer() { // TODO Auto-generated method stub } public String getCustomer() { // TODO Auto-generated method stub return "string"; } public boolean deleteCustomer() { // TODO Auto-generated method stub return false; } public void addCustomerAppended() { // TODO Auto-generated method stub } public void deleteCustomerVoid() { // TODO Auto-generated method stub //return false; } 

请在下面找到我的MainApp课程:

 public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "Spring-Customer.xml"); CustomerService cs = context.getBean("customerBo", CustomerService.class); cs.addCustomer(); cs.addCustomerAppended(); cs.deleteCustomer(); cs.deleteCustomerVoid(); cs.getCustomer(); } } 

我原以为只会调用getCustomer(),因为它是唯一一个返回字符串但是在运行应用程序时我在控制台中得到以下输出:

 logAfter() is running! String : null hijacked : addCustomer ****** logAfter() is running! String : null hijacked : addCustomerAppended ****** logAfter() is running! String : null hijacked : deleteCustomerVoid ****** logAfter() is running! String : string hijacked : getCustomer ****** 

请在下面找到我的pom.xml:

  4.0.0 com.aop.spring SpringAopOnly 0.0.1-SNAPSHOT jar SpringAopOnly http://maven.apache.org  3.0.5.RELEASE UTF-8    junit junit 4.8.2 test    org.springframework spring-core ${spring.version}   org.springframework spring-context ${spring.version}    org.springframework spring-aop ${spring.version}   org.aspectj aspectjrt 1.6.11   org.aspectj aspectjweaver 1.6.11    

请在下面找到我的配置文件:

  <!--  -->        

知道为什么要调用void方法吗?

我也尝试将afterReturning从String更改为boolean然后我得到预期的结果,只调用deleteCustomer,因为它返回一个布尔值。

非常感谢您的回复。

returning参数仅指定

用于将返回值绑定到的通知签名中的参数名称

你的实际切入点

 @AfterReturning(value= "execution(* com.aop..CustomerServiceImpl.*(..))", returning= "string") 

正在指定

 execution(* com.aop..CustomerServiceImpl.*(..)) 

其中*匹配所有返回类型。

你应该把它改成

 execution(java.lang.String com.aop..CustomerServiceImpl.*(..)) 

如果只想要声明为返回String


注释value表达式中的返回类型和方法参数类型都将在将要建议的方法中发挥作用。 例如

 @AfterReturning(value = "execution(String com.aop..CustomerServiceImpl.*(..))", returning = "random") public void returnStringPointcut(JoinPoint joinPoint, Integer random) { 

什么都不匹配。


另外,您应该考虑升级Spring和aspectj版本。 我认为很多这些问题要么已修复,要么整体库更稳定。