The default profile is always active. Spring Boot loads all properties in application. yml into the default profile. We could rename the configuration file to application-default.
The solution would be to create more property files and add the "profile" name as the suffix and configure Spring Boot to pick the appropriate properties based on the profile. Then, we need to create three application. properties : application-dev.
Spring profiles can also be activated via Maven profiles, by specifying the spring. profiles. active configuration property. This command will package the application for prod profile.
You can autowire the Environment
@Autowired
Environment env;
Environment
offers:
String[] getActiveProfiles()
,String[] getDefaultProfiles()
, and boolean acceptsProfiles(String... profiles)
Extending User1648825's nice simple answer:
@Value("${spring.profiles.active}")
private String activeProfile;
This may throw an IllegalArgumentException if no profiles are set (I get a null value). This may be a Good Thing if you need it to be set; if not use the 'default' syntax for @Value, ie:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
...activeProfile now contains 'Unknown' if spring.profiles.active could not be resolved
Here is a more complete example.
Autowire Environment
First you will want to autowire the environment bean.
@Autowired
private Environment environment;
Check if Profiles exist in Active Profiles
Then you can use getActiveProfiles()
to find out if the profile exists in the list of active profiles. Here is an example that takes the String[]
from getActiveProfiles()
, gets a stream from that array, then uses matchers to check for multiple profiles(Case-Insensitive) which returns a boolean if they exist.
//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();
}
You can also achieve similar functionality using the annotation @Profile("local")
Profiles allow for selective configuration based on a passed-in or environment parameter. Here is more information on this technique: Spring Profiles
@Value("${spring.profiles.active}")
private String activeProfile;
It works and you don't need to implement EnvironmentAware. But I don't know drawbacks of this approach.
If you're not using autowiring, simply implement EnvironmentAware
Seems there is some demand to be able to access this statically.
How can I get such thing in static methods in non-spring-managed classes? – Aetherus
It's a hack, but you can write your own class to expose it. You must be careful to ensure that nothing will call SpringContext.getEnvironment()
before all beans have been created, since there is no guarantee when this component will be instantiated.
@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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With