1

是否可以根据布尔占位符属性配置spring来实例化bean?或者至少根据这样的属性从注释扫描中排除一个包?

4

4 回答 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();
    }
    }

http://javapapers.com/spring/spring-conditional-annotation/

于 2017-01-01T19:37:37.863 回答