Я не хочу, чтобы загружался конкретный компонент, если активный профиль тестовый или локальный. Однако, когда я установил следующее, spring, кажется, обрабатывает как «или», и метод запускается как когда активный профиль - тестовый, так и локальный. Однако, если удалить, скажем, локально и сохранить тест, компонент не будет создан, когда профиль является тестовым.
@Profile({"!test","!local"})
Я должен использовать аннотации. свойство устанавливается в application.yml.
Возможный дубликат Spring: как использовать И в профилях?
Возможный дубликат Как условно объявить Bean, когда несколько профилей неактивны?
@Compass В моем сценарии мне нужно использовать! Profile. Я предполагаю, что в связанном ответе НЕ используется.
Единственный другой способ, о котором я могу думать, который не попадает в странное переписывание Spring, - это проверить профили, предоставленные перед запуском, и добавить дополнительный профиль специально для этого профиля, который обрабатывает это.
Вы используете пружинный ботинок, и если да, то 1 или 2?




Используйте @Profile({"Dummy"}).
Вы можете заменить "Dummy", если хотите использовать действительное имя профиля позже.
Спасибо @Sundarrajan. Но я хочу, чтобы это выполнялось для других профилей, таких как dev, qa или чего-либо еще, что я мог бы добавить в будущем.
При использовании Spring Boot 1.X вы можете обновить свойство системы с помощью дополнительного имени профиля и обработать всю логическую логику перед вашим SpringApplication.run. Если он соответствует требованиям, вы должны добавить имя профиля к активным профилям. Если этого не произойдет, вы ничего не измените.
Это очень простая проверка, но вы можете добавить более строгую проверку профиля, такую как нулевую проверку и фактическое разделение списка профилей.
String profile = System.getProperty("spring.profiles.active");
if (!profile.contains("test") && !profile.contains("local")) {
System.setProperty("spring.profiles.active", profile + ",notdev");
}
Если вы используете Spring Boot 2.0, вы можете использовать addAdditionalProfiles для добавления профиля (у меня нет приложения SB2, поэтому я не могу его протестировать, но я предполагаю, что он просто добавляет его в список свойств системы).
String profile = System.getProperty("spring.profiles.active");
if (!profile.contains("test") && !profile.contains("local")) {
SpringApplication.addAdditionalProfiles("notdev");
}
Тогда ваша аннотация может быть:
@Profile({"notdev"})
Начиная с Spring 5.1 (включен в Spring Boot 2.1), можно использовать выражение профиля внутри аннотации строки профиля. Так:
В Spring 5.1 (Spring Boot 2.1) и выше это так же просто, как:
@Component
@Profile("!test & !local")
public class MyComponent {}
Spring 4.x и 5.0.x:
Для этой версии Spring существует множество подходов, каждый из которых имеет свои плюсы и минусы. Когда не так много комбинаций, которые нужно охватить, мне лично нравится подход использования @Conditional, например @Stanislav ответил, в аналогичном вопросе. Я размещаю решение здесь для удобства читателя:
Ваш весенний боб:
@Component
@Conditional(value = { NotTestNorLocalProfiles.class })
public class MyComponent {}
Реализация NotTestNorLocalProfiles:
public class NotTestNorLocalProfiles implements Condition {
@Override
public boolean matches(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
return !context.getEnvironment().acceptsProfiles("test")
&& !context.getEnvironment().acceptsProfiles("local");
}
}
В подобных вопросах можно найти другие подходы:
Как условно объявить Bean, когда несколько профилей неактивны?
Вам нужно использовать аннотации или вы можете использовать среду для получения свойств?