Spring和AOP编程的新手。在Spring AOP教程上工作,编写可拦截方法调用的方面。想启用时间记录。
按照本教程的说明,我创建了一个用于日志记录的自定义注释,以及一个方面来定义调用此注释时应执行的操作。 下面的代码是TrackTime批注:
package com.in28minutes.springboot.tutorial.basics.example.aop;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackTime {}
但是Eclipse显示错误– “元素无法解析为变量/保留项无法解析为变量”
然后我用“ TrackTime”注释创建了一个名为MethodExecutionCalculationAspect的方面。
@Around("@annotation(com.in28minutes.springboot.tutorial.
basics.example.aop.TrackTime)")
MethodExecutionCalculationAspect
package com.in28minutes.springboot.tutorial.basics.example.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
@Aspect
@Configuration
public class MethodExecutionCalculationAspect {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Around("@annotation
(com.in28minutes.springboot.tutorial.basics.example.aop.TrackTime)")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
joinPoint.proceed();
long timeTaken = System.currentTimeMillis() - startTime;
logger.info("Time Taken by {} is {}", joinPoint, timeTaken);
}
}
@Around使用围绕建议。它拦截方法调用,并使用joinPoint.proceed()执行该方法。 @annotation(com.in28minutes.springboot.tutorial.basics.example.aop.TrackTime)是定义基于注释的拦截的切入点-@annotation 然后是注释的完整类型名称。
一旦我纠正了注释和建议,我希望在用于时间跟踪的方法上使用注释。如下所示:
@Service
public class Business1 {
@TrackTime
public String calculateSomething(){
任何帮助将不胜感激。
有关该项目的信息如下:
SpringBootTutorialBasicsAplication.java: 使用Spring Initializer生成的Spring Boot应用程序类。此类充当应用程序的启动点。
•pom.xml:包含使用Spring Boot Starter AOP构建该项目所需的所有依赖项。
•Business1.java,Business2.java,Dao1.java,Dao2.java:业务类依赖于DAO类。
•我们将编写方面来拦截对这些业务类和DAO类的调用。
•AfterAopAspect.java:实现一些After建议。
•UserAccessAspect.java:实现“先行”建议以进行访问检查。
•BusinessAopSpringBootTest.java:调用业务方法的单元测试。
•Maven 3.0+是您的构建工具 •Eclipse。 •JDK 1.8 +
答案 0 :(得分:2)
您的TrackTime
缺少RetentionPolicy
和Target
的导入。
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;