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方法执行)
你之前的问题分析
- 版本兼容性问题:你用的AspectJ 1.8.13和sbt-aspectj 0.11.0版本较老,存在一些兼容性问题,升级到匹配的新版本后很多问题会自动解决。
- 织入目标缺失:原来的配置只把AspectJ编译的切面类加入了处理列表,没有包含Scala编译的业务类,导致切面无法织入到目标方法上。
- 调试信息缺失:没有开启织入日志,无法直观确认切面是否被正确处理,添加
-showWeaveInfo可以帮你快速排查问题。
内容的提问来源于stack exchange,提问作者AlexFel
相关产品推荐
相关产品推荐

