# Spring profiles

As Java projects pass from development into production it is sometimes necessary to use different suites of project dependencies and settings, loaded as a profile. In a typical Spring project this can be achieved following a project structure such as:

<div align="left"><figure><img src="/files/A0VUoZYJ4HmXjLWiBTb3" alt="" width="271"><figcaption></figcaption></figure></div>

A class `service.LoaderService`

```groovy
package com.diffblue.service;
import com.diffblue.loader.Loader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
// Simple service implementation
@Service
public class LoaderService {
  private final Loader loader;
  @Autowired
  public LoaderService(Loader loader) {
    this.loader = loader;
  }
  public String getMessage() {
    return "service + " + loader.getMessage();
  }
}
```

has an instance of an interface `loader.Loader`.

```groovy
package com.diffblue.loader;
// Example interface.
public interface Loader {
  String getMessage();
}
```

Another class `loader.MyLoader` implements that interface,

```groovy
package com.diffblue.loader;
/**
* Simple implementation of a loader.
*/
public class MyLoader implements Loader {
  private final String message;
  public MyLoader(String message) {
    this.message = message;
  }
  public String getMessage() {
    return message;
  }
}
```

which is used to supply the `loader.Loader` interface.

This is done in a class `config.ProductionConfig` where the user has the possibility to configure the loader by using the `@Configuration` and `@Profile()` annotations:

```groovy
package com.diffblue.config;
import com.diffblue.loader.Loader;
import com.diffblue.loader.MyLoader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* Load a "production" loader when we're not
* using the test-scenario profile.
*/
@Configuration
@Profile("!test-scenario")
public class ProductionConfig {
  @Bean
  public Loader getLoader() {
    return new MyLoader("production");
  }
}
```

The class `config.ProductionConfig` should be annotated with `@Profile("!test-scenario")` in production mode:

<div align="left"><figure><img src="/files/rbKFUUCw5LIKGHdg2DDo" alt="" width="375"><figcaption></figcaption></figure></div>

When using IntelliJ, the Spring profile in use must be declared in **Run > Edit Configurations > VM Options**:

<div align="left"><figure><img src="/files/cZltOqLCzSYbNTLBjGhY" alt="" width="375"><figcaption></figcaption></figure></div>

In development mode, the annotation `@Profile("test-scenario")`, should be used in a class `config.TestConfig` placed in the test directory:

```groovy
package com.diffblue.config;
import com.diffblue.loader.Loader;
import com.diffblue.loader.MyLoader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* Load a "test" loader when we are using the test-scenario profile.
*/
@Configuration
@ComponentScan
@Profile("test-scenario")
public class TestConfig {
  @Bean
  public Loader getLoader() {
    return new MyLoader("test");
  }
}
```

which configures a test loader through the **loader.TestLoader** also placed in the test directory

```groovy
package com.diffblue.loader;
import org.springframework.context.annotation.Profile;
/**
* Simple implementation of a loader.
*/
@Profile("test-scenario")
public class TestLoader implements Loader {
  private final String message = "static-test-loader";
  public String getMessage() {
    return message;
  }
}
```

These two classes are placed in the test directory in order to be isolated from a run in the production mode.

To use a specific profile in development mode, the [`--active-profiles`](/features/cover-cli/commands-and-arguments.md#active-profiles) option must be used:

```
dcover create --active-profiles=test-scenario
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cover-docs-preview.diffblue.com/features/cover-cli/project-configuration/spring-profiles.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
