面试题答案
一键面试- 引入依赖:
在
build.gradle.kts
文件中添加AspectJ相关依赖:
plugins {
id("org.jetbrains.kotlin.jvm") version "1.8.20"
id("org.aspectj.weaver") version "1.9.9.1"
}
dependencies {
implementation("org.aspectj:aspectjrt:1.9.9.1")
implementation("org.aspectj:aspectjweaver:1.9.9.1")
}
- 定义切面类:
创建一个Kotlin类作为切面,例如
LoggingAspect.kt
:
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import java.util.logging.Logger
@Aspect
class LoggingAspect {
private val logger = Logger.getLogger(LoggingAspect::class.java.name)
@Around("execution(* *(..))")
fun logExecutionTimeAndParams(joinPoint: ProceedingJoinPoint): Any? {
val startTime = System.currentTimeMillis()
val params = joinPoint.args.joinToString()
logger.info("Executing method ${joinPoint.signature.name} with params: $params")
try {
return joinPoint.proceed()
} finally {
val endTime = System.currentTimeMillis()
val executionTime = endTime - startTime
logger.info("Method ${joinPoint.signature.name} executed in $executionTime ms")
}
}
}
- 配置AspectJ织入:
在项目根目录下创建
aop.xml
文件,配置AspectJ织入:
<aspectj>
<aspects>
<aspect name="com.example.LoggingAspect"/>
</aspects>
<weaver options="-verbose">
<include within="com.example..*"/>
</weaver>
</aspectj>
- 启用AspectJ编译器:
在
build.gradle.kts
文件中添加AspectJ编译器配置:
import org.aspectj.gradle.AspectJCompile
tasks {
val compileKotlin by getting {
dependsOn("ajc")
}
val compileTestKotlin by getting {
dependsOn("testAjc")
}
create<AspectJCompile>("ajc") {
sourceSets = listOf(sourceSets.main.get())
configuration = configurations.getByName("implementation")
weaverVersion = "1.9.9.1"
ajcArgs = listOf(
"-1.8",
"-showWeaveInfo",
"-sourcecontext",
"-verbose",
"-Xlint:ignore"
)
}
create<AspectJCompile>("testAjc") {
sourceSets = listOf(sourceSets.test.get())
configuration = configurations.getByName("testImplementation")
weaverVersion = "1.9.9.1"
ajcArgs = listOf(
"-1.8",
"-showWeaveInfo",
"-sourcecontext",
"-verbose",
"-Xlint:ignore"
)
}
}
关键步骤总结:
- 引入AspectJ相关依赖。
- 定义切面类,使用
@Aspect
注解标记,在方法上使用@Around
等注解定义切入点和增强逻辑。 - 配置
aop.xml
文件来指定要织入的切面和织入范围。 - 在Gradle中配置AspectJ编译器,确保代码在编译时进行织入。