设置基本 Spring AOP 配置
Setting up basic Spring AOP configuration
我正在学习 Spring 的 AOP,遵循 this 教程,但不知何故我无法使其工作。我希望我所做的唯一修改是让它与控制器一起工作。
目录结构
-/java
-/com.example.spring_aop
-/aspects
-LoggingAspect.java
-/controllers
-AddController.java
-SpringAopApplication.java
-/resources
-beans.xml
AddController.java
@RestController
public class AddController {
@GetMapping(value = "/{a}+{b}", produces = MediaType.APPLICATION_JSON_VALUE)
public Map add(@PathVariable("a") int a, @PathVariable("b") int b) {
int result = a+b;
return Collections.singletonMap("result", result);
}
}
LoggingAspect.java
@Component
@Aspect
public class LoggingAspect {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Before("execution( * com.example.spring_aop.controllers..*.*(..) )")
public void before(JoinPoint joinPoint) {
logger.info(" ###### before executing method: {} of class: {}",
joinPoint.getSignature().getName(), joinPoint.getTarget().getClass().getName());
}
@AfterReturning(pointcut = "execution( * com.example.spring_aop.controllers..*.*(..) )",
returning = "result")
public void after(Object result) {
logger.info(" ###### method returned: {}", result);
}
}
pom.xml
Spring Web auto-generated (Spring Initializr) pom with one added dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
通过 xml 选择基于注释的配置解决了这个问题。我的问题中出现的 AspectJ 注释实际上已经足够了,所以我只是删除了 beans.xml
配置并且它按预期工作。
我正在学习 Spring 的 AOP,遵循 this 教程,但不知何故我无法使其工作。我希望我所做的唯一修改是让它与控制器一起工作。
目录结构
-/java
-/com.example.spring_aop
-/aspects
-LoggingAspect.java
-/controllers
-AddController.java
-SpringAopApplication.java
-/resources
-beans.xml
AddController.java
@RestController
public class AddController {
@GetMapping(value = "/{a}+{b}", produces = MediaType.APPLICATION_JSON_VALUE)
public Map add(@PathVariable("a") int a, @PathVariable("b") int b) {
int result = a+b;
return Collections.singletonMap("result", result);
}
}
LoggingAspect.java
@Component
@Aspect
public class LoggingAspect {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Before("execution( * com.example.spring_aop.controllers..*.*(..) )")
public void before(JoinPoint joinPoint) {
logger.info(" ###### before executing method: {} of class: {}",
joinPoint.getSignature().getName(), joinPoint.getTarget().getClass().getName());
}
@AfterReturning(pointcut = "execution( * com.example.spring_aop.controllers..*.*(..) )",
returning = "result")
public void after(Object result) {
logger.info(" ###### method returned: {}", result);
}
}
pom.xml
Spring Web auto-generated (Spring Initializr) pom with one added dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
通过 xml 选择基于注释的配置解决了这个问题。我的问题中出现的 AspectJ 注释实际上已经足够了,所以我只是删除了 beans.xml
配置并且它按预期工作。