是否可以根据布尔占位符属性配置spring来实例化bean?或者至少根据这样的属性从注释扫描中排除一个包?
问问题
8691 次
4 回答
8
我认为您应该使用 Spring配置文件来配置不同的行为。但是,如果您使用注释,您可以创建一个 @Configuration 对象和一个工厂方法来创建基于属性值的 bean
例如
@Configuration
class ExampleConfig {
private final String prop;
public ExampleConfig(@Value("${your.prop.name}" prop} {
this.prop = prop;
}
@Bean
public YourBeanClass create() {
if (prop.equals("someValue") {
return new YourBeanClass();
}
return new OtherClass(); // must be subclass/implementation of YBC
}
}
于 2013-07-18T14:56:43.700 回答
4
您可以使用ConditionalOnProperty:
@Bean
@ConditionalOnProperty(value = "property", havingValue = "value", matchIfMissing = true)
public MyBean myBean() ...
另外,请检查此答案。
于 2018-10-11T12:09:49.143 回答
1
这可能不符合您的需求,我假设您可以控制相关类(即不是供应商代码),但是您是否考虑过将 bean 标记为延迟加载?至少,这样它在实际使用之前不会被实例化,这可能会根据您的配置的其余部分有条件地发生。
于 2013-07-18T13:48:12.127 回答
0
你也可以使用@Conditional
第 1 步:创建一个实现 Condition 的类
public class ProdDataSourceCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String dbname = context.getEnvironment().getProperty("database.name");
return dbname.equalsIgnoreCase("prod");
}}
第 2 步:将上述类与 @Conditional 一起使用
@Configuration
public class EmployeeDataSourceConfig {
....
@Bean(name="dataSource")
@Conditional(ProdDataSourceCondition.class)
public DataSource getProdDataSource() {
return new ProductionDatabaseUtil();
}
}
于 2017-01-01T19:37:37.863 回答