当前位置: 首页 > 知识库问答 >
问题:

如何禁止SpringBoot使用相同的bean实例注入相同类型的两个字段?

楮法
2023-03-14

我有一个类,它有两个相同类型的最终字段,我需要在第二个字段中注入nullif属性props。在应用程序中启用了。yml。但是,如果它是falsespringboot则使用相同的bean实例注入这两个字段。

如何禁止SpringBoot使用相同的bean实例注入相同类型的两个字段?

@AllArgsConstructor
public class MySettings {
    private int val;
}

我的配置类

@Configuration
public class MySpringConfig {

    @Bean
    public MySettings settingsA() { 
        return new MySettings(1);    
    } 
    
    @Bean
    @ConditionalOnProperty(prefix = "props", name = "enabled")
    public MySettings settingsB() {
        return new MySettings(2);
    }
}

这是我的课

@Component
@RequiredArgsConstructor
public class MyClass {
    
    private final MySettings settingsA; // MySettings(1)
    private final MySettings settingsB; // also MySettings(1) but must be null if props.enabled=false

    @Value("${props.enabled}")
    private boolean enabled;

    ...
}

这是真正项目的一部分,所以我几乎没有空间偏离


共有1个答案

戚衡
2023-03-14

您需要一个限定符来告诉Spring要注入哪个bean:

@Configuration
public class MySpringConfig {

    @Bean(name = "SettingsA")
    public MySettings settingsA() { 
        return new MySettings(1);    
    } 
    
    @Bean(name = "SettingsB")
    @ConditionalOnProperty(prefix = "props", name = "enabled")
    public MySettings settingsB() {
        return new MySettings(2);
    }
}

现在在MyClass中:

@Component
public class MyClass {
    
    private final MySettings settingsA;
    private final MySettings settingsB;

    @Value("${props.enabled}")
    private boolean enabled;

    public MyClass(@Qualifier("SettingsA") MySettings settingsA, @Qualifier("SettingsB") MySettings settingsB) {
        this.settingsA = settingsA;
        this.settingsB = settingsB;
    }

    ...
}

然而,由于这些bean中的一个可能不可用,我相信您不需要将其包含在构造函数注入中,否则您将得到一个错误。在这种情况下,您需要执行以下操作:

@Component
public class MyClass {

    @Qualifier("SettingsA") 
    @Autowired
    private MySettings settingsA;

    @Qualifier("SettingsB")
    @Autowired(required = false)
    private MySettings settingsB;

    @Value("${props.enabled}")
    private boolean enabled;

    ...
}
 类似资料:
  • 我试图在我的实体中有两个相同域类的字段,但我得到了这个错误: org.hibernate.mappingException:无法确定表:Outhories中:com.packt.webapp.domain.user的类型,列:[org.hibernate.mapping.column(author)] 我只想将意见映射到已评论的用户,并将评论的作者存储在字段中。当我移除字段时,一切正常。这个例子有

  • 问题内容: 我有以下定义。 在我的bean定义中,我有两个相同类型的bean 如果有所不同,则从另一个xml文件导入第二个bean。它们也设置了不同的属性。为什么spring不会抛出错误,因为已经定义了2个相同类型的bean。它是否使用变量名,因为它们与bean id匹配。dao是不同的,如果我对两个不同的bean使用@Qualifiers,则功能可以按预期工作。 这是一个更简洁的版本。我没有考虑

  • 我有两个spring bean类实现相同的接口。 你能给我一个建议吗。

  • 问题内容: 我喜欢基于构造函数的注入,因为它允许我进行注入的字段。我还喜欢注释驱动的注入,因为它简化了我的操作。只要没有两个相同类型的参数,就可以用标记构造函数,并且一切正常。例如,我有一个课: 以及具有以下内容的应用程序上下文: 应该有一种在类的构造函数上指定bean ID的方法,但是我在文档中找不到它。是否有可能,或者我是否梦想着不存在的解决方案? 问题答案: 是按类型(在这种情况下);用于按

  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

  • 问题内容: 我有一个包装连接池的类,该类从spring配置中获取其连接详细信息,如下所示: 此bean稍后在服务中使用,并与注释自动关联。 我的问题是,我该如何复制该bean并为其提供不同的连接详细信息,然后在服务中添加它。意思除了上面,我将有: 并在服务中: 问题答案: 您可以与结合使用,但在这种情况下,我建议使用: 甚至更简单: