Spring @Conditional基于数据库表中的值

问题描述 投票:0回答:3

条件评估取决于数据库表中提供的值

@Component
public class XYZCondition implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
              //based on value defined in DB should return true/false
    }

}

由于Condition执行得很早,无法获取db值有没有其他方法可以实现这一目标?

java spring-boot spring-4
3个回答
0
投票

嗯,也许您可​​以只创建一个配置类并注入您的存储库,然后创建一个Bean。然后在bean方法内部从数据库中获取值并返回条件实例。像这样的东西

@Configuration
public class Config {

@Autowired  
private Repository repository;

@Bean
public Interface interface(){
  boolean val = reposiory.getDBValue();
  if(val)
    return new Impl1();
  else
    return new Impl2();
  }
}

0
投票

数据库值可以在应用程序工作期间更改,而重新加载应用程序上下文似乎不是一个好主意。因此,我建议使用配置属性来选择在上下文中应该可用的bean。

此外,还有一个Spring Cloud Config,可让您将配置存储在git或其他一些存储中。配置更改后,其使用者可以重新启动上下文。似乎也值得一看。


0
投票

嗯,您正在尝试做这种形式的弹簧靴无法很好地映射的事情。

我建议稍微改变一下要求:

不是尝试在自定义条件下访问数据库,而是创建自定义配置源并将属性从数据库加载到环境中,以便以后在启动过程中对条件进行评估时,该属性具有关联的值(以前是通过数据库解决的)已经可用。

采用这种方法的示例是:-从“远程”配置服务(通过REST)读取配置属性的Spring Boot云配置-Spring boot consul集成(显然从领事那里读取)

此方法对春季更友好,并且还可以保存应用程序免于多次调用数据库的操作(如果您有100个具有此自定义条件的bean,那该怎么做-它将执行100个查询吗?

现在,这可能意味着您将不需要自定义条件-可能是属性上的@Condition

另一个警告是,您将无法使用JPA / Spring数据加载此属性,在这里您可能必须使用Plain JDBC。

© www.soinside.com 2019 - 2024. All rights reserved.