Spring Boot Profiles example

In this article, we will show you how to use @Profile in Spring Boot and also how to test it.

Tested with :

  • Spring Boot 2.1.2.RELEASE
  • Maven 3

1. Project Structure

A standard Maven project structure.

project directory

2. Project Dependency

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-profile</artifactId>
    <packaging>jar</packaging>
    <name>Spring Boot Profiles Example</name>
    <description>Spring Boot Profiles Example</description>
    <url>https://www.mkyong.com</url>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Package as an executable jar/war -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>

        </plugins>
    </build>
</project>

3. Spring Boot

In Spring Boot, the default profile is ‘default‘. Review the following weather services.

3.1 An interface.

WeatherService.java

package com.mkyong.service;

public interface WeatherService {

    String forecast();

}

3.2 Profile : sunny and default.

SunnyDayService.java

package com.mkyong.service;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

@Service
@Profile({"sunny", "default"})
public class SunnyDayService implements WeatherService {

    @Override
    public String forecast() {
        return "Today is sunny day!";
    }

}

3.3 Profile : raining.

RainingDayService.java

package com.mkyong.service;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

@Service
@Profile("raining")
public class RainingDayService implements WeatherService {

    @Override
    public String forecast() {
        return "Today is raining day!";
    }

}

3.4 Start Spring Boot application.

Application.java

package com.mkyong;

import com.mkyong.service.WeatherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private WeatherService weatherService;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) {
        System.out.println(weatherService.forecast());
    }

}

3.5 A properties file.

application.properties

# default profile is 'default'
#spring.profiles.active=sunny

logging.level.=error
spring.main.banner-mode=off

4. Unit Test

Some Unit test examples.

4.1 Unit test a service class. Set an active profile via @ActiveProfiles

TestWeatherService.java

package com.mkyong;

import com.mkyong.service.WeatherService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("raining")
public class TestWeatherService {

    @Autowired
    WeatherService weatherService;

    @Test
    public void testRainingProfile() {
        String output = weatherService.forecast();
        assertThat(output).contains("Today is raining day!");
    }
}

4.2 Unit test a Spring Boot application. You can set an active profile via property spring.profiles.active

TestApplication.java

package com.mkyong;

import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.test.rule.OutputCapture;

import static org.assertj.core.api.Assertions.assertThat;

public class TestApplication {

    @Rule
    public OutputCapture outputCapture = new OutputCapture();

    @Test
    public void testDefaultProfile() {
        Application.main(new String[0]);
        String output = this.outputCapture.toString();
        assertThat(output).contains("Today is sunny day!");
    }

    @Test
    public void testRainingProfile() {
        System.setProperty("spring.profiles.active", "raining");
        Application.main(new String[0]);
        String output = this.outputCapture.toString();
        assertThat(output).contains("Today is raining day!");
    }

    @Test
    public void testRainingProfile_withDoption() {
        Application.main(new String[]{"--spring.profiles.active=raining"});
        String output = this.outputCapture.toString();
        assertThat(output).contains("Today is raining day!");
    }

    @After
    public void after() {
        System.clearProperty("spring.profiles.active");
    }

}

P.S Credit to this Spring Boot SampleProfileApplicationTests

5. DEMO

Package and run it.


$ mvn package

#default profile, sunny day!
$ java -jar target/spring-boot-profile-1.0.jar
Today is sunny day!

# set a profile
$ java -jar -Dspring.profiles.active=raining target/spring-boot-profile-1.0.jar
Today is raining day!

Download Source Code

$ git clone https://github.com/mkyong/spring-boot.git
$ cd profile-simple
$ mvn package
$ java -jar -Dspring.profiles.active=raining target/spring-boot-profile-1.0.jar

References

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

avatar
3 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
HelixcsCharlieMonir Recent comment authors
newest oldest most voted
Monir
Guest
Monir

Thank you very much. I am following your site since 2010. It saves a lot of time.

Helixcs
Guest
Helixcs

I do not think profile in spring boot is more convenient than profile in maven? and this action will cause more redundancy class.

Charlie
Guest
Charlie

Good tutorials