确定在运行时加载哪个JavaConfig类

时间:2014-03-10 23:47:28

标签: java spring spring-java-config

有多个使用@Configuration注释的类,我想在顶级配置组件中决定在上下文中注册哪一个。

@Configuration
public class FileSystemDataStoreConfiguration {
  public @Bean DataStore getDataStore() {
    return new FileSystemDataStore(withSomeConfigProperties);
  }
}

@Configuration
public class DatabaseDataStoreConfiguration {
  public @Bean DataStore getDataStore() {
    return new DatabaseDataStore(withSomeConfigProperties);
  }
}

@Configuration
public class DataStoreConfiguration {

  // Some arbitrary logic to decide whether I want to load
  // FileSystem or Database configuration.

}

据我所知,我可以使用@Profile在多个配置类中进行选择。但是,我已经使用配置文件来区分环境。配置类的选择与环境无关。

如何在运行时选择要加载的配置类?

我可以拥有多个活动配置文件,例如“Production,WithDatabase”吗?

如果是这样,我如何根据属性添加个人资料?

2 个答案:

答案 0 :(得分:2)

如果您使用的是Spring 4,则可以使用新的@Conditional注释功能(实际上是用于实现@Profile的后端)

答案 1 :(得分:2)

春天,所以有很多方法可以做事!

如果您保留所有注释,则可以使用@ActiveProfiles注释,以启用所需的整个配置文件集:

@ActiveProfiles(profiles = ProfileDefinitions.MY_ENABLED_PROFILE)
@ContextConfiguration(as usual from here...)

您会看到“个人资料”允许设置许多个人资料。您不需要将配置文件存储为常量,但您可能会觉得有用:

public class ProfileDefinitions {

    public static final String MY_ENABLED_PROFILE = "some-profile-enabled";

    // you can even make profiles derived from others:
    public static final String ACTIVE_WHEN_MY_IS_NOT = "!" + MY_ENABLED_PROFILE;
}

使用以上所有内容,您可以根据配置文件的动态设置选择性地启用各种配置:

@Profile(ProfileDefinitions.MY_ENABLED_PROFILE)
@Configuration
@Import({these will only be imported if the profile is active!})
public class DatabaseDataStoreConfiguration {
}

@Profile(ProfileDefinitions.ACTIVE_WHEN_MY_IS_NOT)
@Configuration
@Import({if any are necessary})
public class DataStoreConfiguration {
}
相关问题