我想在下面的@RequestMapping方法調用上做AOP,注意hello()方法是不是 public。如何在Spring Boot中使用Private/protected RequestMapping執行AOP
@RestController
class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String hello() {
return "Hello";
}
}
這裏是主類,我添加了@Aspect,@EnableAspectJAutoProxy註釋。
@Aspect
@EnableAspectJAutoProxy(proxyTargetClass = true)
@SpringBootApplication
public class FooServiceApplication {
public static void main(String[] args) {
SpringApplication.run(FooServiceApplication.class, args);
}
@Around("@annotation(requestMapping)")
public Object around(ProceedingJoinPoint pjp, RequestMapping requestMapping) throws Throwable {
return pjp.proceed();
}
}
在pom.xml中我只是添加下面的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
的結果是,如果你好()方法是公共的,在AOP只會工作正常,但如果同樣的例子以上未經公開聲明,AOP完全不起作用。但不是EnableAspectJAutoProxy將使用CGLIB並可以攔截受保護/私有方法調用?
不,不可能的,這是基於代理的AOP的限制。 –
@ M.Deinum我檢查了[aop上的Spring Boot文檔](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators) ,可以使用Spring驅動的[native AspectJ weaving](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw)到解決這個問題,但不推薦,對不對? –