Spring profiles provide the ability to separate parts of your application's configuration and make them accessible only in certain environments. Any @Component, @Configuration or @ConfigurationProperties can be marked with a @Profile annotation to restrict loading, as shown in the following example:

Java
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {
    // ...
}
Kotlin
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile
@Configuration(proxyBeanMethods = false)
@Profile("production")
class ProductionConfiguration {
    // ...
}
If beans with the @ConfigurationProperties annotation are registered through the @EnableConfigurationProperties annotation instead of automatically scanning, the @Profile annotation must be set to a class marked with the @Configuration annotation that contains the @EnableConfigurationProperties annotation. In case @ConfigurationProperties annotations are scanned, the @Profile annotation can be specified for the class itself, marked with the @ConfigurationProperties annotation.

You can use the spring.profiles.active property for Environment to specify which profiles are active. The property can be set in any of the ways described earlier in this chapter. For example, you can include it as part of the application.properties file, as shown in the following example:

Properties
spring.profiles.active=dev,hsqldb
Yaml
spring:
  profiles:
    active: "dev,hsqldb"

You can also set it on the command line using the following switch: --spring.profiles.active=dev,hsqldb.

If no profile is active, the default profile will be activated. The default profile name is default and can be fine-tuned using the spring.profiles.default property for Environment, as shown in the following example:

Properties
spring.profiles.default=none
Yaml
spring:
  profiles:
    default: "none"

spring.profiles.active and spring.profiles.default can only be used in non-profile documents. This means that they cannot be included in profile-specific files or documents activated using spring.config.activate.on-profile.

For example, the configuration of the second document is invalid:

Properties
# this document is valid
spring.profiles.active=prod
#---
# this document is invalid
spring.config.activate.on-profile=prod
spring.profiles.active=metrics
Yaml
# this document is valid
spring:
  profiles:
    active: "prod"
---
# this document is invalid
spring:
  config:
    activate:
      on-profile: "prod"
  profiles:
    active: "metrics"

Adding active profiles

The property spring.profiles.active follows the same ordering rules as other properties: The one with the highest PropertySource has the highest priority. This means that you can set active profiles in application.properties and then replace them using a command line switch.

Sometimes it is useful to have properties that adding to active profiles rather than replacing them. The spring.profiles.include property can be used to add active profiles on top of those enabled by the spring.profiles.active property. The SpringApplication entry point also has a Java API for installing additional profiles. See the setAdditionalProfiles() method in the section on SpringApplication.

For example, if an application runs with the following properties, the public and local profiles will be activated, even if it is run using the --spring.profiles.active switch:

Properties
spring.profiles.include[0]=common
spring.profiles.include[1]=local
Yaml
spring:
  profiles:
    include:
      - "common"
      - "local"
Like spring.profiles.active, spring.profiles.include can only be used in documents, not related to the profile. This means that it cannot be included in profile-specific files or documents activated using spring.config.activate.on-profile.

Profile groups

Sometimes the profiles that are defined and used in an application are too fine-grained and become cumbersome to use. For example, there may be profiles proddb and prodmq, which are used to independently enable database and messaging functionality.

The Spring Boot feature helps with this, which allows you to define groups of profiles. A profile group allows you to define a logical name for an associated profile group.

For example, we can create a production group consisting of our proddb and prodmq profiles.

Properties
spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq
Yaml
spring:
  profiles:
    group:
      production:
      - "proddb"
      - "prodmq"

The application can now be launched using --spring.profiles.active=production to activate the production, proddb and prodmq profiles at a time.

Program installation of profiles

You can set active profiles programmatically by calling SpringApplication.setAdditionalProfiles(…​) before running the application. You can also activate profiles using the ConfigurableEnvironment interface from Spring.

Configuration files associated with a specific profile

Profile-specific options for both application.properties (or application.yml) and files referenced through the @ConfigurationProperties are counted as files and downloaded.