holic512 2024-10-10 21:41 采纳率: 77.8%
浏览 22

spring从数据库中加载配置文件来使用ConditionalOnProperty

在开发中,一个服务接口会出现多个实现类,在区分使用哪个实现类的时候,通常使用ConditionalOnProperty 搭配havingvaule 来控制。
ConditionalOnProperty所获取的配置文件来源是application.yml,
我想要通过在数据库中获取配置,并将配置可以用于充当于写在yml有一样的效果

具体情况就是图片管理实现类

img

img

来通过启动spring时 在数据库中获取到 service.imagestoragemode 然后在加载进去,以达到控制使用哪个实现类的功能

不使用配置中心

  • 写回答

3条回答 默认 最新

  • 编号灬9527 2024-10-11 14:08
    关注

    你要是使用ConditionalOnProperty这种方案,就算是读取到了新的配置,也没啥用!
    spring cloud 提供了RefreshScope注解,它也只是监听到配置修改后,刷新context(主要是更新注入的属性,properties数据),你这种做法,在context生成时就只有匹配到的实现类才会被spring管理, 其他实现类压根就不会交给spring管理,这时候刷新context是不起作用的(第一次假设你的配置匹配选择了实现类a,生成spring容器并且管理这个a类,第二次即使修改到b实现类,但是spring容器并不会重新生成,b类永远是不会交给spring管理,你就切不到实现类b),你从源头上就不具备这个切换到未交给容器管理bean的功能,

    你自己提供一个特殊的接口实现类并且被Primary注解标记,这个类里面动态去获取数据库配置的bean,然后去调用它的方法,实现简单,你也不需要改动现在的代码

    img

    评论

报告相同问题?

问题事件

  • 修改了问题 10月10日
  • 创建了问题 10月10日