1. 引入依赖
<!-- 用于织入 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!-- 引入aspectj -->
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.3</version>
</dependency>
aspectjweaver 是用于织入的,如果是 springBoot 项目可以引入。
2. 编辑切面
本例中是利用注解 + aspectj 对接口进行加强的,注解是为了方便分类和控制接口,实际上注解并不是必须的,可根据实际情况确定。
2.1 创建注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeCount {
}
2.2 使用注解
将创建的注解标注在想要增强的方法上,例如:
@TimeCount
public static Result uploadFile(int hostIndex, String bucketname, InputStream inputStream, Map<String, String> params){
2.3 编写切面
拦截带有 @TimeCount 注解的所有方法,使用 @Around 注解,会在需要增强的方法运行前后分别执行一次 timeCount 切面。
切面中涉及到一个类 com.google.common.base.Stopwatch,这是个可以用来计时的类。
@Around("@annotation(com.hdec.file.annotation.TimeCount)")
public Object timeCount(ProceedingJoinPoint joinPoint){
Object object = null;
Stopwatch stopwatch = Stopwatch.createStarted();
try{
object = joinPoint.proceed();
} catch (Throwable throwable) {
logger.info("error info: {}", throwable.getMessage());
}
logger.info("API completed, takes " + stopwatch.elapsed(TimeUnit.MILLISECONDS)/1000.0 + " s.");
return object;
}
3. 织入
pom 中的 plugins 增加以下配置,这一步和第一步中的 aspectjweaver 是一样的,在 SpringBoot 项目中可以省略。
<!-- 编译期织入 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
网友评论