Spring Aspects(AspectJ)似乎不起作用

时间:2015-02-10 11:49:01

标签: spring spring-mvc aspectj spring-aop

嗯,我真的不知道为什么这不起作用:

每个需要的罐子都在那里。包括aspectjrt。 基本上我从配置类开始:

@Configuration
@ComponentScan(basePackages = { "some.path" })
@EnableAspectJAutoProxy
public class SomeConf { ... }

然后我有Aspect

@Component
@Aspect
public class ControllerLoggerAspect {

    @Pointcut("execution(* some.path.ATest.*(..))")
    private void aspectTest() {
        System.out.println("\n\n ASPECT WORKING \n\n");
    }
}

some.path下{我有Atest课程:

打包some.path;

public class ATest {

    public void dummyMethod(){
        System.out.println("\n\n\nDummy static executed\n\n\n");
    }
}

想象一下,我有控制器:

@Controller
@RequestMapping(value = "/mapping")
public class SomeController {

    @RequestMapping(value = "/something")
    public ResponseEntity<String> publish(@RequestParam("Id") Long[] ids) {
        //aspect should be invoked here
        new ATest().dummyMethod();

        return new ResponseEntity<>("{ \"status\": \"stubbed\"}", HttpStatus.OK);
    }

}

除了方面方法之外,所有内容都被正确调用。没有错误,没有例外,没有。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

Spring AOP仅适用于Spring bean,即如果要拦截其中一种方法,则类ATest必须是@Component

答案 1 :(得分:0)

您需要配置要执行的建议切入点仅有助于确定连接点。建议将被执行,而不是切入点。

您可以使用切入点&#34; aspectTest()&#34;来编写这样的建议:

@Before("aspectTest()")
public void beforeAdvice(){
     System.out.println("\n\n ASPECT WORKING \n\n");
}

或者你可以用示例注释替换示例中的Pointcut注释:

@Before("execution(* some.path.ATest.*(..))")
public void aspectTest() {
    System.out.println("\n\n ASPECT WORKING \n\n");
}

这里有一个所有adivces的列表:

  • @Before(&#34; aspectTest()&#34)
  • @After(&#34; aspectTest()&#34)
  • @AfterReturning(pointcut =&#34; aspectTest()&#34 ;, return =&#34; retVal&#34;)
  • @AfterThrowing(pointcut =&#34; aspectTest()&#34 ;, throw =&#34; ex&#34;)
  • @Around(&#34; aspectTest()&#34)