Мені потрібно кодувати різну логіку на основі різних поточних профілів оточення. Як можна отримати поточні активні та типові профілі від Spring?
Мені потрібно кодувати різну логіку на основі різних поточних профілів оточення. Як можна отримати поточні активні та типові профілі від Spring?
Відповіді:
Розширення простої відповіді User1648825 (я не можу коментувати, і мою редакцію відхилено):
@Value("${spring.profiles.active}")
private String activeProfile;
Це може викинути IllegalArgumentException, якщо не встановлені профілі (я отримую нульове значення). Це може бути хорошою справою, якщо вам потрібно її встановити; якщо не використовувати синтаксис 'за замовчуванням' для @Value, тобто:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... activeProfile тепер містить "Невідомо", якщо spring.profiles.active не вдалося вирішити
Ось більш повний приклад.
Автомобільне середовище
По-перше, вам захочеться автоматично з'єднати середовище.
@Autowired
private Environment environment;
Перевірте, чи існують профілі в активних профілях
Потім ви можете getActiveProfiles()
дізнатися, чи існує профіль у списку активних профілів. Ось приклад, який бере String[]
з getActiveProfiles()
, отримує потік з цього масиву, а потім використовує matchers для перевірки наявності декількох профілів (Case-Insensitive), які повертають булеві, якщо вони існують.
//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("test")
|| env.equalsIgnoreCase("local")) ))
{
doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("prod")) ))
{
doSomethingForProd();
}
Ви також можете досягти подібних функціональних можливостей за допомогою анотації. @Profile("local")
Профілі дозволяють здійснювати селективну конфігурацію на основі параметра, що передається або середовища. Ось додаткова інформація про цю техніку: Весняні профілі
@Value("${spring.profiles.active}")
private String activeProfile;
Він працює, і вам не потрібно впроваджувати EnvironmentAware. Але я не знаю недоліків такого підходу.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Програми також можуть використовувати spring.profiles.include
властивість та можуть програматично встановлювати профілі під час ініціалізації ConfigurableEnvironment
. Environment.getActiveProfiles()
отримає повний список профілів, встановлених за допомогою будь-якого з цих механізмів.
Якщо ви не використовуєте автоматичну проводку, просто виконайте її EnvironmentAware
Здається, є певний попит на доступ до цього статично.
Як я можу отримати таке в статичних методах у класах, що не керуються весною? - Ефір
Це хак, але ви можете написати власний клас, щоб викрити його. Ви повинні бути обережними, щоб нічого не зателефонувати SpringContext.getEnvironment()
до створення всіх бобів, оскільки немає гарантії, коли цей компонент буде інстанційним.
@Component
public class SpringContext
{
private static Environment environment;
public SpringContext(Environment environment) {
SpringContext.environment = environment;
}
public static Environment getEnvironment() {
if (environment == null) {
throw new RuntimeException("Environment has not been set yet");
}
return environment;
}
}