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

为什么Scala编写的Spring Boot应用中CommandLineRunner的run方法未执行

问题根本原因

Spring Boot只会调用Spring容器中托管的CommandLineRunner实现类实例的run方法,你当前的写法不符合该要求,具体问题如下:

  • 你实现CommandLineRunner的是Scala的单例对象TestCompany,这个对象没有被Spring扫描注册到容器中,Spring感知不到该实例的存在
  • 你启动应用时指定的启动类是TestCompanyApp,这个类本身既没有实现CommandLineRunner,也没有将TestCompany声明为Spring托管Bean

两种常见解决方法

方法1:启动类本身实现CommandLineRunner

import org.slf4j.{Logger, LoggerFactory}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.{CommandLineRunner, SpringApplication}

@SpringBootApplication
class TestCompanyApp extends CommandLineRunner{
  val logger:Logger = LoggerFactory.getLogger(classOf[TestCompanyApp])
  override def run(args: String*): Unit = {
    logger.error("Worked!")
  }
}

object TestCompany{
  def main(args: Array[String]): Unit = {
    val logger = LoggerFactory.getLogger("TestCompany")
    logger.error("Starting....")
    SpringApplication.run(classOf[TestCompanyApp], args)
  }
}

方法2:将CommandLineRunner实现类注册为Spring Bean

可以给实现类加@Component注解让Spring自动扫描到,兼容性更好的写法是改用class实现而非单例对象:

import org.slf4j.{Logger, LoggerFactory}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.{CommandLineRunner, SpringApplication}
import org.springframework.stereotype.Component

@SpringBootApplication
class TestCompanyApp

@Component
class TestCompanyRunner extends CommandLineRunner{
  val logger:Logger = LoggerFactory.getLogger(classOf[TestCompanyApp])
  override def run(args: String*): Unit = {
    logger.error("Worked!")
  }
}

object TestCompany{
  def main(args: Array[String]): Unit = {
    val logger = LoggerFactory.getLogger("TestCompany")
    logger.error("Starting....")
    SpringApplication.run(classOf[TestCompanyApp], args)
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:06:04