无论如何可以在运行时更新@Bean吗?



对于我的项目,我想从API下载并将此信息存储在地图中。此外,我想将地图作为另一个类中的豆子。我怀疑 API 会定期更新,所以我设置了一个从 API 下载 XML 文件的@Schedule。 对问题...如何在每次下载 XML 时使用 API 中的信息更新地图。我不想每次都重新启动应用程序。

我对 Spring 框架很陌生,所以如果有更优雅的方法可以做到这一点,请告诉我。

data class DataContainer(val dictionary: MutableMap<String, String>)
@Configuration
@Component
class DownloadRenhold {
var dict: MutableMap<String, String> = xmlToDict("/renhold.xml")
val dataContainer: DataContainer
@Bean
get() = DataContainer(dict)
fun download(link: String, path: String) {
URL(link).openStream().use { input ->
FileOutputStream(File(path)).use { output ->
input.copyTo(output)
}
}
}
@Scheduled(fixedRate = 5000)
fun scheduledDL() {
download("www.link.com","src/main/resources/renhold.xml")
dict = xmlToDict("/renhold.xml")
}
class Controller {
@GetMapping(value = ["/{orgnummer}"]) // @RequestMapping(value="/",method=RequestMethod.GET)
fun orgNrRequest(@PathVariable("orgnummer") nr: String): String? {
var actx = AnnotationConfigApplicationContext(DownloadRenhold::class.java)
var dataContainer = actx.getBean(DataContainer::class.java)
return dataContainer.dictionary[nr]
}
```

我建议不要直接将DataContainer作为豆子。而是将DownRenhold作为单例豆注入Controller。大致如下:

// No need to make this class a Configuration. Plain Component would suffice.
// @Configuration
@Component
class DownloadRenhold {
var _dataContainer: DataContainer = null
var dataContainer: DataContainer
get() = _dataContainer
@Scheduled(fixedRate = 5000)
fun scheduledDL() {
_dataContainer = // do your download thing and create a DataContainer instance.
}
}
class Controller {
@Autowired
var dataProvider: DownloadRenhold
@GetMapping(value = ["/{orgnummer}"])
@RequestMapping(value="/",method=RequestMethod.GET)
fun orgNrRequest(@PathVariable("orgnummer") nr: String): String? {
dataProvider.dataContainer // access the current data container
}

最新更新