根据属性占位符有条件地实例化一个spring bean

时间:2013-07-18 13:44:01

标签: java spring

是否可以配置spring来实例化bean,具体取决于布尔占位符属性?或者至少从基于这样的属性的注释扫描中排除包?

4 个答案:

答案 0 :(得分:6)

我认为您应该使用Spring 配置文件来配置不同的行为。但是,如果使用注释,则可以创建@Configuration对象和工厂方法,以根据属性值创建bean

e.g。

@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
    } 
}

答案 1 :(得分:1)

这可能不符合您的需求,我假设您可以控制有问题的类(即不是供应商代码),但您是否考虑过将该标记为延迟加载的bean?至少,这样它在实际使用之前不会被实例化,这可能会有条件地发生,具体取决于你的配置的其余部分。

答案 2 :(得分:1)

您可以使用 ConditionalOnProperty

    from imap_tools import MailBox

gautham_gmail_box = MailBox('imap.gmail.com')
gautham_gmail_box.login('my_email@gmail.com','my_password')

还要检查this答案。

答案 3 :(得分: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/