gpt4 book ai didi

java - @Conditional on bean 初始化

转载 作者:行者123 更新时间:2023-11-30 06:53:19 26 4
gpt4 key购买 nike

我找这个已经有一段时间了。

到目前为止,我找到了this博客非常有用,但没有解决我的问题。

只有当flag为真时,我才想@Autowired一个bean,否则我希望它为null

用例:

如果其中一个数据库正在维护,我不希望我的应用程序失败。

@Bean("sqlDatabase")
public Database getSqlDatabase(@Value("${datasource.sql.url}") String url,
@Value("${datasource.sql.username}") String username, @Value("${datasource.sql.password}") String password,
@Value("${datasource.poolsize.min}") int minPoolSize, @Value("${datasource.poolsize.max}") int maxPoolSize,
@Value("${database.enable-sql}") boolean isSqlEnabled) {
if (isSqlEnabled)
return Database.builder().url(url).pool(minPoolSize, maxPoolSize).username(username).password(password)
.build();
else
return null;
}

现在,在这种情况下,它会抛出错误,因为我无法autowire null bean。

我想使用@Conditional,但我的情况有点复杂。我已经需要更新所有 3 个数据库。如果不满足条件,我只想跳过其中之一。

最佳答案

您可以使用配置文件。每个数据库都有一个配置文件

  • db1
  • db2
  • db3

然后使用必须激活才能使用该 bean 的配置文件来注释 bean 类或 bean 方法

@Profile("db1")
@Bean("db1")
public Database getSqlDatabase(...){...}

当您启动应用程序时,只有激活相关配置文件后,才会创建用@Profile注释的bean。

您可以通过设置属性“spring.profiles.active”来激活配置文件。激活 db1 和 db2:

spring.profiles.active=db1,db3

您可以在属性文件中或作为命令行参数设置该属性。

配置文件为您提供了很大的灵 active ,可以通过配置更改 spring 上下文

  • 您可以使用相同的配置文件注释许多 Bean
  • 您可以使用配置文件注释配置类
  • 您可以使用配置文件特定的属性文件
  • 您可以在一个 @Profile 注释中使用多个配置文件。将使用逻辑“or”,因此如果配置文件“db1”处于 Activity 状态或配置文件“db2”处于 Activity 状态,则将创建用 @Profile("db1","db2") 注释的 bean
    • 如果您想要“或”以外的其他内容,您可以使用@Conditional来定义您自己的逻辑

请注意:如果您不使用组件扫描或 xml 配置,则 bean 类中的注释 @Profile 无效。您需要使用 @Profile 或整个配置类来注释 bean 方法。

关于java - @Conditional on bean 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42312541/

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