如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?

Posted

技术标签:

【中文标题】如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?【英文标题】:how to load config in spring-webflux without spring-boot? 【发布时间】:2018-03-31 18:42:00 【问题描述】:

我只是用 spring webflux 5.0.0 和 Kotlin 做了一些实验,我在从 application.yml 加载配置时遇到了问题

对于基础项目,我从这个例子开始 spring-kotlin-functional 但是只有手动加载 bean 和路由,而没有从配置文件中加载任何内容或示例如何以这种方式实现 @ConfigurationProperties 类的模拟。

我已经尝试在 bean 部分获取环境:

data class DbConfig(
    var url: String = "",
    var user: String = "",
    var password: String = ""
)

fun beans(): BeanDefinitionDsl = beans 
    bean 
        //try to load config from path=db to data class DbConfig
        env.getProperty("db", DbConfig::class.java)
    

    bean<DBConfiguration>()

    //controllers
    bean  StatsController(ref()) 
    bean  UserController(ref()) 

    //repository
    bean  UserRepository(ref()) 

    //services
    bean  StatsService(ref()) 

    //routes
    bean  Routes(ref(), ref()) 
    bean("webHandler") 
        RouterFunctions.toWebHandler(ref<Routes>().router(), HandlerStrategies.builder().viewResolver(ref()).build())
    

    //view resolver
    bean 
        val prefix = "classpath:/templates/"
        val suffix = ".mustache"
        val loader = MustacheResourceTemplateLoader(prefix, suffix)
        MustacheViewResolver(Mustache.compiler().withLoader(loader)).apply 
            setPrefix(prefix)
            setSuffix(suffix)
        
    

但Environment中只有系统属性

所以问题是如何从 application.yml 加载配置以及如何以这种功能样式实现 @ConfigurationProperties 的模拟?

我是否正确理解没有 spring-boot 所有注释(如@Bean、@Repository、@Transactional 和其他)都不适用于 Beans?

我的消息来源:github

2017 年 10 月 21 日更新

找到解决方案。问题与没有任何 BeanPostProcessor 的事实有关。在我包含这两个处理器之后:

bean<CommonAnnotationBeanPostProcessor>()
bean<ConfigurationClassPostProcessor>() 

注释@Configuration@Bean@PostConstruct 开始工作。但是注解@ConfigurationProperties只存在于spring-boot依赖中,而yml解析类我只在spring-boot-starter中找到..

在包含依赖 spring-boot-starter 并将 bean&lt;ConfigurationPropertiesBindingPostProcessor&gt;() 添加到 beans 部分后,注释 @ConfigurationProperties 开始工作,但来自 application.yml 的配置也不包括在内。所以我添加了这个部分:

val resource = ClassPathResource("/application.yml")
val sourceLoader = YamlPropertySourceLoader()
val properties = sourceLoader.load("main config", resource, null)
environment.propertySources.addFirst(properties)

GenericApplicationContext 配置。现在一切都按我的预期工作,但包含一个依赖项spring-boot-starter

完整代码示例:version with fixes

【问题讨论】:

【参考方案1】:

Spring boot 只是一种依赖管理,它构建了您可以覆盖的自动配置。 所有的特性都继承自 Spring 框架和模块。所以基本上你可以在有或没有启动的情况下做同样的事情。

我还没有使用 webflux。但是当您引用其他 bean 时,您需要在其他地方声明一个配置 bean。

我相信我会帮你的...

【讨论】:

感谢您的回答!但正如我所见,这个注释不起作用,或者我做错了什么.. 哦,那是什么?您应该发布它以帮助他人 更新帖子,并描述解决方案。

以上是关于如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?的主要内容,如果未能解决你的问题,请参考以下文章

p5.j​​s:如何在不改变背景或使用外部画布的情况下在画布形状上打孔?

如何在不使用“|”的情况下在一行中连接两个集合

如何在不使用 Eclipse 的情况下在 Android 上安装/替换

如何在没有spring-boot的情况下使用eureka+feign?

如何在没有添加的情况下在 Heroku 中启用堆栈跟踪

如何在没有中间目录的情况下在图库中编写视频?