Spring 方面 (AspectJ) 似乎不起作用

Spring Aspects (AspectJ) does not seem to work

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

所需的每个罐子都已到位。包括aspectjrt。 基本上我从配置 class:

开始
@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下我有Atestclass:

包 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);
    }

}

除方面方法外,一切都被正确调用。没有错误,没有异常,什么都没有。有什么想法吗?

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

您可以使用切入点编写这样的建议 "aspectTest()":

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

或者您可以将示例中的切入点注释替换为这样的建议注释:

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

这里有所有建议的列表:

  • @之前("aspectTest()")
  • @After("aspectTest()")
  • @AfterReturning(切入点="aspectTest()",返回="retVal")
  • @AfterThrowing(切入点="aspectTest()",投掷="ex")
  • @Around("aspectTest()")

Spring AOP 仅适用于 Spring beans,即如果你想拦截它的方法之一,class ATest 需要是 @Component.