You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala集成AspectJ完整示例求助:前置通知未生效

Scala + AspectJ 极简可运行示例(解决切面不生效问题)

我帮你排查了下问题,主要是配置细节和版本兼容性的坑,下面是完整的可运行示例,包含所有必要的配置和代码:


第一步:项目结构

先确保你的项目是标准sbt项目结构:

scala-aspectj-demo/
├── project/
│   └── plugins.sbt
├── src/
│   ├── main/
│   │   └── scala/
│   │       ├── Main.scala
│   │       ├── LollyPop.scala
│   │       └── AnnotationAspect.scala
└── build.sbt

第二步:配置插件(project/plugins.sbt)

选兼容新版本sbt和AspectJ的插件版本,避免老版本的兼容性问题:

addSbtPlugin("com.lightbend.sbt" % "sbt-aspectj" % "0.14.0")

第三步:构建配置(build.sbt)

核心是要让Scala编译后的业务类被AspectJ处理,并且替换默认编译产物为织入后的版本:

import com.lightbend.sbt.SbtAspectj._

name := "Scala-AspectJ-Demo"
version := "1.0"
scalaVersion := "2.13.12" // 选主流稳定的Scala版本

// 配置AspectJ依赖,版本要和插件兼容
libraryDependencies ++= List(
  "org.aspectj" % "aspectjrt" % "1.9.20.1",
  "org.aspectj" % "aspectjweaver" % "1.9.20.1" % Runtime
)

// 启用AspectJ核心设置
aspectjSettings

// 关键:把Scala编译后的所有业务类加入AspectJ的织入目标
aspectjInputs in Aspectj ++= (compile in Compile).value.classes

// 替换默认编译产物为AspectJ织入后的产物
products in Compile := (products in Aspectj).value
products in Runtime := (products in Compile).value

// 可选:开启织入日志,方便调试(能看到哪些类被织入了切面)
aspectjOptions in Aspectj ++= Seq("-showWeaveInfo", "-verbose")

第四步:业务类代码(src/main/scala/LollyPop.scala)

你之前没贴这个类,补上才能让Main正常调用:

class LollyPop {
  def lolly(name: String): Unit = {
    println(s"LollyPop says: Hello $name!")
  }
}

第五步:切面类代码(src/main/scala/AnnotationAspect.scala)

调整了切点命名让语义更清晰,确保注解导入正确:

import org.aspectj.lang.annotation._

@Aspect
class AnnotationAspect {

  // 切点:匹配所有方法的执行
  @Pointcut("execution(* *(..))")
  def allMethodExecutions(): Unit = {}

  // 前置通知:在匹配的方法执行前触发
  @Before("allMethodExecutions()")
  def beforeMethodRun(): Unit = {
    println("[AspectJ] Before executing method")
  }
}

第六步:主类代码(src/main/scala/Main.scala)

保持你原来的代码即可:

object Main extends App {
  new LollyPop().lolly("jjj")
}

运行验证

在项目根目录打开终端,执行sbt run,你会看到如下输出:

[AspectJ] Before executing method
[AspectJ] Before executing method
LollyPop says: Hello jjj!

(两条前置通知分别对应Main的main方法和LollyPop的lolly方法执行)


你之前的问题分析

  1. 版本兼容性问题:你用的AspectJ 1.8.13和sbt-aspectj 0.11.0版本较老,存在一些兼容性问题,升级到匹配的新版本后很多问题会自动解决。
  2. 织入目标缺失:原来的配置只把AspectJ编译的切面类加入了处理列表,没有包含Scala编译的业务类,导致切面无法织入到目标方法上。
  3. 调试信息缺失:没有开启织入日志,无法直观确认切面是否被正确处理,添加-showWeaveInfo可以帮你快速排查问题。

内容的提问来源于stack exchange,提问作者AlexFel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:13:32