gpt4 book ai didi

spring - Autowiring 在 Scala Spring Boot 项目中不起作用

转载 作者:行者123 更新时间:2023-12-04 08:44:54 24 4
gpt4 key购买 nike

考虑到以下示例,我尝试在 SampleStarter 中使用 Sample 配置 bean 以正确填充 bean 来启动服务。 .scala 文件的名称是 SampleStarter.scalaSample 是在同一个文件中定义的。

@SpringBootApplication
@Service
object SampleStarter {

@(Autowired @setter)
var sample: Sample = _ // always null, @Autowired not working?

def getInstance() = this

def main(args: Array[String]): Unit = {
SpringApplication.run(classOf[Sample], args: _*)

sample.run()
}

}

@Configuration
@ConfigurationProperties("sample")
@EnableConfigurationProperties
class Sample {

@BeanProperty
var myProperty: String = _

def run(): Unit = { // bean config seems OK, when debugging with @PostConstruct the 'myProperty' value is filled properly
print(myProperty)
}

}

每当我在 SpringApplication.run(classOf[Sample], args: _*) 之后点击 sample.run() 时,sample 属性始终为空。我认为这与 Scala 中的 object 有关,因为它们的所有成员都是静态的 AFAIK。我接受了这个 SO 问题 How to use Spring Autowired (or manually wired) in Scala object?作为灵感,但仍然无法使我的代码正常工作。

我实例化类的方式有问题还是与 Scala 相关?

编辑

根据@Rob 的回答,这就是我试图复制他的解决方案所做的。

@SpringBootApplication
@Service
object SampleStarter {

@(Autowired @setter)
var sample: Sample = _

def getInstance() = this

def main(args: Array[String]): Unit = {
SpringApplication.run(classOf[Sample], args: _*)

sample.run()
}

}


@Configuration // declares this class a source of beans
@ConfigurationProperties("sample") // picks up from various config locations
@EnableConfigurationProperties // not certain this is necessary
class AppConfiguration {

@BeanProperty
var myProperty: String = _

@Bean
// Error -> Parameter 0 of constructor in myproject.impl.Sample required a bean of type 'java.lang.String' that could not be found.
def sample: Sample = new Sample(myProperty)

}

class Sample(@BeanProperty var myProperty: String) {

def run(): Unit = {
print(myProperty)
}

}

最佳答案

@Configuration 声明了一个能够提供 @Bean 的源文件。这不是你想要的。您希望/需要将 Sample 作为 POJO 类(POSO?),然后让另一个类“AppConfiguration”(比如说)用 @Configuration 注释,创建一个 @Bean输入 示例

我的 scala 非常生锈,所以这可能根本无法编译,但结构应该大致正确。

@Configuration // declares this class a source of beans
@ConfigurationProperties("sample") // picks up from various config locations
@EnableConfigurationProperties // not certain this is necessary
class AppConfiguration {

@Bean
def getSample(@BeanProperty myProperty: String): Sample = new Sample(myProperty)

}
class Sample {

var myProperty: String

def Sample(property : String) = {
this.myProperty = myProperty
}

def run(): Unit = {
print(myProperty)
}
}

现在你有一个 Sample 类作为 @Bean 并且它可以是 @Autowired 在任何需要的地方。

@SpringBootApplication
@Service
object SampleStarter {

// note its typically better to inject variables into a constructor
// rather than directly into fields as the behaviour is more predictable
@Autowired
var sample: Sample

def getInstance() = this // not required ??

def main(args: Array[String]): Unit = {
SpringApplication.run(classOf[Sample], args: _*)

sample.run()
}
}

FWIW,您可以独立启动 SpringBoot 应用程序并将 @Service 的逻辑完全分开。 @Service 是另一种类型的 @Bean 并且可供 SpringBootApplication 的其余部分使用。

关于spring - Autowiring 在 Scala Spring Boot 项目中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64370817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com