为什么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
相关产品推荐
相关产品推荐

