我有一个类,它有两个相同类型的最终字段,我需要在第二个字段中注入null
if属性props。在
应用程序中启用了
。yml
为假
。但是,如果它是false
springboot则使用相同的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;
...
}
这是真正项目的一部分,所以我几乎没有空间偏离
您需要一个限定符来告诉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并为其提供不同的连接详细信息,然后在服务中添加它。意思除了上面,我将有: 并在服务中: 问题答案: 您可以与结合使用,但在这种情况下,我建议使用: 甚至更简单: