parent
38f9a7b072
commit
4184ebe799
|
|
@ -49,7 +49,7 @@ import org.springframework.core.env.Profiles;
|
||||||
* <p>If a {@code @Configuration} class is marked with {@code @Profile}, all of the
|
* <p>If a {@code @Configuration} class is marked with {@code @Profile}, all of the
|
||||||
* {@code @Bean} methods and {@link Import @Import} annotations associated with that class
|
* {@code @Bean} methods and {@link Import @Import} annotations associated with that class
|
||||||
* will be bypassed unless one or more of the specified profiles are active. A profile
|
* will be bypassed unless one or more of the specified profiles are active. A profile
|
||||||
* string may contains a simple profile name (for example {@code "p1"}) or a profile
|
* string may contain a simple profile name (for example {@code "p1"}) or a profile
|
||||||
* expression. A profile expression allows for more complicated profile logic to be
|
* expression. A profile expression allows for more complicated profile logic to be
|
||||||
* expressed, for example {@code "p1 & p2"}. See {@link Profiles#of(String...)} for more
|
* expressed, for example {@code "p1 & p2"}. See {@link Profiles#of(String...)} for more
|
||||||
* details about supported formats.
|
* details about supported formats.
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ public interface Environment extends PropertyResolver {
|
||||||
/**
|
/**
|
||||||
* Return the set of profiles explicitly made active for this environment. Profiles
|
* Return the set of profiles explicitly made active for this environment. Profiles
|
||||||
* are used for creating logical groupings of bean definitions to be registered
|
* are used for creating logical groupings of bean definitions to be registered
|
||||||
* conditionally, for example based on deployment environment. Profiles can be
|
* conditionally, for example based on deployment environment. Profiles can be
|
||||||
* activated by setting {@linkplain AbstractEnvironment#ACTIVE_PROFILES_PROPERTY_NAME
|
* activated by setting {@linkplain AbstractEnvironment#ACTIVE_PROFILES_PROPERTY_NAME
|
||||||
* "spring.profiles.active"} as a system property or by calling
|
* "spring.profiles.active"} as a system property or by calling
|
||||||
* {@link ConfigurableEnvironment#setActiveProfiles(String...)}.
|
* {@link ConfigurableEnvironment#setActiveProfiles(String...)}.
|
||||||
|
|
@ -98,11 +98,11 @@ public interface Environment extends PropertyResolver {
|
||||||
* Return whether one or more of the given profiles is active or, in the case of no
|
* Return whether one or more of the given profiles is active or, in the case of no
|
||||||
* explicit active profiles, whether one or more of the given profiles is included in
|
* explicit active profiles, whether one or more of the given profiles is included in
|
||||||
* the set of default profiles. If a profile begins with '!' the logic is inverted,
|
* the set of default profiles. If a profile begins with '!' the logic is inverted,
|
||||||
* i.e. the method will return true if the given profile is <em>not</em> active.
|
* i.e. the method will return {@code true} if the given profile is <em>not</em> active.
|
||||||
* For example, <pre class="code">env.acceptsProfiles("p1", "!p2")</pre> will
|
* For example, {@code env.acceptsProfiles("p1", "!p2")} will return {@code true} if
|
||||||
* return {@code true} if profile 'p1' is active or 'p2' is not active.
|
* profile 'p1' is active or 'p2' is not active.
|
||||||
* @throws IllegalArgumentException if called with zero arguments
|
* @throws IllegalArgumentException if called with zero arguments
|
||||||
* or if any profile is {@code null}, empty or whitespace-only
|
* or if any profile is {@code null}, empty, or whitespace only
|
||||||
* @see #getActiveProfiles
|
* @see #getActiveProfiles
|
||||||
* @see #getDefaultProfiles
|
* @see #getDefaultProfiles
|
||||||
* @see #acceptsProfiles(Profiles)
|
* @see #acceptsProfiles(Profiles)
|
||||||
|
|
@ -112,7 +112,8 @@ public interface Environment extends PropertyResolver {
|
||||||
boolean acceptsProfiles(String... profiles);
|
boolean acceptsProfiles(String... profiles);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return whether the active profiles match the given {@link Profiles} predicate.
|
* Return whether the {@linkplain #getActiveProfiles() active profiles}
|
||||||
|
* match the given {@link Profiles} predicate.
|
||||||
*/
|
*/
|
||||||
boolean acceptsProfiles(Profiles profiles);
|
boolean acceptsProfiles(Profiles profiles);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@ package org.springframework.core.env;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Profile predicate that may be {@link Environment#acceptsProfiles(Profiles) accepted} by
|
* Profile predicate that may be {@linkplain Environment#acceptsProfiles(Profiles)
|
||||||
* an {@link Environment}.
|
* accepted} by an {@link Environment}.
|
||||||
* <p>
|
*
|
||||||
* May be implemented directly or, more usually, created using the {@link #of(String...)
|
* <p>May be implemented directly or, more usually, created using the
|
||||||
* of(...)} factory method.
|
* {@link #of(String...) of(...)} factory method.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
* @since 5.1
|
* @since 5.1
|
||||||
|
|
@ -32,31 +32,36 @@ import java.util.function.Predicate;
|
||||||
public interface Profiles {
|
public interface Profiles {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if this profile predicate matches against given active profiles.
|
* Test if this profile predicate matches against the given active profiles
|
||||||
* @param activeProfiles test whether a given profile is currently active
|
* predicate.
|
||||||
|
* @param activeProfiles predicate that tests whether a given profile is
|
||||||
|
* currently active
|
||||||
*/
|
*/
|
||||||
boolean matches(Predicate<String> activeProfiles);
|
boolean matches(Predicate<String> activeProfiles);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a new {@link Profiles} instance that checks for matches against the given
|
* Return a new {@link Profiles} instance that checks for matches against the given
|
||||||
* profile strings. The returned instance will
|
* profile strings.
|
||||||
* {@link Profiles#matches(Predicate)} match} if any one of the given profile strings
|
*
|
||||||
* match.
|
* <p>The returned instance will {@linkplain Profiles#matches(Predicate) match}
|
||||||
* <p>
|
* if any one of the given profile strings matches.
|
||||||
* A profile string may contains a simple profile name (for example
|
*
|
||||||
* {@code "production"}) or a profile expression. A profile expression allows for more
|
* <p>A profile string may contain a simple profile name (for example
|
||||||
* complicated profile logic to be expressed, for example
|
* {@code "production"}) or a profile expression. A profile expression allows
|
||||||
|
* for more complicated profile logic to be expressed, for example
|
||||||
* {@code "production & cloud"}.
|
* {@code "production & cloud"}.
|
||||||
* <p>
|
*
|
||||||
* The following operators are supported in profile expressions:
|
* <p>The following operators are supported in profile expressions:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@code !} - A logical <em>not</em> of the profile</li>
|
* <li>{@code !} - A logical <em>not</em> of the profile</li>
|
||||||
* <li>{@code &} - A logical <em>and</em> of the profiles</li>
|
* <li>{@code &} - A logical <em>and</em> of the profiles</li>
|
||||||
* <li>{@code |} - A logical <em>or</em> of the profiles</li></li>
|
* <li>{@code |} - A logical <em>or</em> of the profiles</li>
|
||||||
* <p>
|
* </ul>
|
||||||
* Please note that the {@code &} and {@code |} operators may not be mixed without
|
*
|
||||||
* using parentheses. For example {@code "a & b | c"} is not a valid expression, it
|
* <p>Please note that the {@code &} and {@code |} operators may not be mixed
|
||||||
* must be expressed as {@code "(a & b) | c"}.
|
* without using parentheses. For example {@code "a & b | c"} is not a valid
|
||||||
|
* expression; it must be expressed as {@code "(a & b) | c"} or
|
||||||
|
* {@code "a & (b | c)"}.
|
||||||
*
|
*
|
||||||
* @param profiles the profiles to include
|
* @param profiles the profiles to include
|
||||||
* @return a new {@link Profiles} instance
|
* @return a new {@link Profiles} instance
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ package org.springframework.core.env;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
|
@ -30,6 +29,7 @@ import org.springframework.util.StringUtils;
|
||||||
* Internal parser used by {@link Profiles#of}.
|
* Internal parser used by {@link Profiles#of}.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @since 5.1
|
||||||
*/
|
*/
|
||||||
class ProfilesParser {
|
class ProfilesParser {
|
||||||
|
|
||||||
|
|
@ -43,7 +43,7 @@ class ProfilesParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Profiles parseExpression(String expression) {
|
private static Profiles parseExpression(String expression) {
|
||||||
Assert.hasText(expression,
|
Assert.hasText(expression, () ->
|
||||||
"Invalid profile expression [" + expression + "]: must contain text");
|
"Invalid profile expression [" + expression + "]: must contain text");
|
||||||
StringTokenizer tokens = new StringTokenizer(expression, "()&|!", true);
|
StringTokenizer tokens = new StringTokenizer(expression, "()&|!", true);
|
||||||
return parseTokens(expression, tokens);
|
return parseTokens(expression, tokens);
|
||||||
|
|
@ -97,7 +97,7 @@ class ProfilesParser {
|
||||||
|
|
||||||
private static void assertWellFormed(String expression, boolean wellFormed) {
|
private static void assertWellFormed(String expression, boolean wellFormed) {
|
||||||
Assert.isTrue(wellFormed,
|
Assert.isTrue(wellFormed,
|
||||||
() -> "Malformed profile expression '" + expression + "'");
|
() -> "Malformed profile expression [" + expression + "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Profiles or(Profiles... profiles) {
|
private static Profiles or(Profiles... profiles) {
|
||||||
|
|
@ -122,7 +122,7 @@ class ProfilesParser {
|
||||||
return (profiles) -> profiles.matches(activeProfile);
|
return (profiles) -> profiles.matches(activeProfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Operator {
|
private enum Operator {
|
||||||
AND,
|
AND,
|
||||||
OR
|
OR
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ import static org.junit.Assert.*;
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
* @author Stephane Nicoll
|
* @author Stephane Nicoll
|
||||||
|
* @since 5.1
|
||||||
*/
|
*/
|
||||||
public class ProfilesTests {
|
public class ProfilesTests {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7664,19 +7664,19 @@ straight JNDI `InitialContext` usage shown above, but not the `JndiObjectFactory
|
||||||
variant which would force you to declare the return type as the `FactoryBean` type.
|
variant which would force you to declare the return type as the `FactoryBean` type.
|
||||||
====
|
====
|
||||||
|
|
||||||
The profile string may contains a simple profile name (for example `production`) or a
|
The profile string may contain a simple profile name (for example `production`) or a
|
||||||
profile expression. A profile expression allows for more complicated profile logic to be
|
profile expression. A profile expression allows for more complicated profile logic to be
|
||||||
expressed, for example `production & us-east`. The following operators are supported in
|
expressed, for example `production & us-east`. The following operators are supported in
|
||||||
profile expressions:
|
profile expressions:
|
||||||
|
|
||||||
* `!` - A logical not of the profile
|
* `!` - A logical _not_ of the profile
|
||||||
* `&` - A logical and of the profiles
|
* `&` - A logical _and_ of the profiles
|
||||||
* `|` - A logical or of the profiles
|
* `|` - A logical _or_ of the profiles
|
||||||
|
|
||||||
[NOTE]
|
[NOTE]
|
||||||
====
|
====
|
||||||
The `&` and `|` operators may not be mixed without using parentheses. For example
|
The `&` and `|` operators may not be mixed without using parentheses. For example
|
||||||
`production & us-east | eu-central` is not a valid expression, it must be expressed as
|
`production & us-east | eu-central` is not a valid expression; it must be expressed as
|
||||||
`production & (us-east | eu-central)`.
|
`production & (us-east | eu-central)`.
|
||||||
====
|
====
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue