有多个使用@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”吗?
如果是这样,我如何根据属性添加个人资料?
答案 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 {
}