1概要

この記事では、SpringでのProfilesの使い方を説明します。

Spring 3.1では、

dev



test



prod

などのBeanをさまざまなプロファイルにマッピングできるようになりました。

その後、必要なBeanだけをブートストラップするために、さまざまな環境でさまざまなプロファイルをアクティブにすることができます。

** 2 Beanで

@ Profile

を使用する

**

簡単に始めて、Beanを特定のプロファイルに所属させる方法を見てみましょう。

@ Profile

アノテーションを使用する – Beanをその特定のプロファイルにマッピングします。注釈は単に1つ(または複数)のプロファイルの名前を取ります。

基本的なシナリオを考えてみましょう – 開発中にのみアクティブにし、プロダクションにはデプロイしないBeanがあります。このBeanには ”

dev

“プロファイルの注釈を付けます。開発中はコンテナ内にしか存在しません。実稼働では、

dev

は単にアクティブにはなりません。

@Component
@Profile("dev")
public class DevDatasourceConfig

ちょっとしたメモとして、プロファイル名の前にNOT演算子を付けることもできます。プロファイルからそれらを除外するには、 ”

!dev

“を使用します。

以下の例では、コンポーネントは「

dev

」プロファイルがアクティブでない場合にのみアクティブになります。

@Component
@Profile("!dev")
public class DevDatasourceConfig


3 XMLでプロファイルを宣言する

プロファイルはXMLで設定することもできます –

<beans>

タグは

“profiles”

属性を持ち、これは該当するプロファイルのカンマ区切り値を取ります。

<beans profile="dev">
    <bean id="devDatasourceConfig"
      class="org.baeldung.profiles.DevDatasourceConfig"/>
</beans>


4プロファイル設定

次のステップは、それぞれのBeanがコンテナーに登録されるようにプロファイルをアクティブにして設定することです。

これはさまざまな方法で行うことができます。これについては次のセクションで説明します。


4.1.

WebApplicationInitializer

インターフェースを介してプログラム的に

Webアプリケーションでは、

WebApplicationInitializer

を使用して

ServletContext

をプログラムで設定できます。

アクティブプロファイルをプログラムで設定するのにも非常に便利な場所です。

@Configuration
public class MyWebApplicationInitializer
  implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        servletContext.setInitParameter(
          "spring.profiles.active", "dev");
    }
}


4.2.

ConfigurableEnvironment


を介してプログラム的に

環境に直接プロファイルを設定することもできます。

@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("someProfile");


4.3.

web.xml


のコンテキストパラメータ

同様に、コンテキストパラメータを使用して、Webアプリケーションの

web.xml




プロファイルをアクティブにすることもできます。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/app-config.xml</param-value>
</context-param>
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</context-param>


4.4. JVMシステムパラメータ

プロファイル名は、JVMシステムパラメータを介して渡すこともできます。パラメータとして渡されたプロファイル名は、アプリケーションの起動時に有効になります。

-Dspring.profiles.active=dev


4.5. 環境変数

Unix環境では、

プロファイルは環境変数

によってアクティブにすることもできます。

export spring__profiles__active=dev


4.6. Mavenのプロフィール


__spring.profiles.active

__configurationプロパティを指定することで、Mavenプロファイルを介してSpringプロファイルをアクティブにすることもできます。

すべてのMavenプロファイルで、

spring.profiles.active

プロパティを設定できます。

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profiles.active>dev</spring.profiles.active>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <spring.profiles.active>prod</spring.profiles.active>
        </properties>
    </profile>
</profiles>

その値は、__ @ link:を置き換えるために使用されます。

----[email protected]@
----

それでは、

pom.xml

でリソースフィルタリングを有効にする必要があります。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    ...
</build>

そして、どのMavenプロファイルを適用するかを切り替えるために

-P

パラメータを追加します。

mvn clean package -Pprod

このコマンドは

prod

profile用のアプリケーションをパッケージ化します。このアプリケーションが実行されているときは、このアプリケーションの

__spring.profiles.active


value

「prod」__も適用されます。

** 4.7. テストの

@ ActiveProfile

**

テストはどのプロファイルがアクティブであるかを特定することを非常に簡単にします – 特定のプロファイルを有効にするために

@ ActiveProfile

アノテーションを使う:

@ActiveProfiles("dev")

まとめると、プロファイルを有効にする方法は複数あります。ここで、どちらがもう一方よりも優先されるのか、また、複数を使用した場合に何が起こるかを見てみましょう – 最高から最低の優先順位へ


  1. web.xml

    のコンテキストパラメータ


  2. WebApplicationInitializer

  3. JVMシステムパラメータ

  4. 環境変数

  5. Mavenのプロファイル


5デフォルトのプロファイル

プロファイルを指定しないBeanはすべて、 ”

default

“プロファイルに属します。

Springは他のプロファイルがアクティブになっていないときにデフォルトのプロファイルを設定する方法も提供しています – “

spring.profiles.default

”プロパティを使うことによって。


6. アクティブプロファイルを取得

プロファイルがアクティブになったら、

Environment

を注入するだけで、実行時にアクティブなプロファイルを取得できます。

public class ProfileManager {
    @Autowired
    Environment environment;

    public void getActiveProfiles() {
        for (final String profileName : environment.getActiveProfiles()) {
            System.out.println("Currently active profile - " + profileName);
        }
    }
}

** 7. プロファイルの使用例

**

基本は邪魔にならないので、実際の例を見てみましょう。

開発環境と本番環境の両方でデータソース設定を維持する必要があるというシナリオを考えてみましょう。

両方のデータソース実装で実装する必要がある共通のインターフェース

DatasourceConfig

を作成しましょう。

public interface DatasourceConfig {
    public void setup();
}

開発環境の構成は次のとおりです。

@Component
@Profile("dev")
public class DevDatasourceConfig implements DatasourceConfig {
    @Override
    public void setup() {
        System.out.println("Setting up datasource for DEV environment. ");
    }
}

実稼働環境向けの構成

@Component
@Profile("production")
public class ProductionDatasourceConfig implements DatasourceConfig {
    @Override
    public void setup() {
       System.out.println("Setting up datasource for PRODUCTION environment. ");
    }
}

それではテストを作成して、DatasourceConfigインターフェースを挿入しましょう。アクティブなプロファイルに応じて、Springは

DevDatasourceConfig

または

ProductionDatasourceConfig

beanを注入します。

public class SpringProfilesTest {
    @Autowired
    DatasourceConfig datasourceConfig;

    public void setupDatasource() {
        datasourceConfig.setup();
    }
}



dev

”プロファイルがアクティブになっているときは、

DevDatasourceConfig

オブジェクトが挿入され、

setup()

メソッドを呼び出すと、次の出力が得られます。

Setting up datasource for DEV environment.


8 Spring Bootのプロファイル

Spring Bootは、これまでに概説したすべてのプロファイル設定をサポートしますが、いくつかの追加機能があります。

セクション4で紹介した初期化パラメータ

spring.profiles.active

は、現在アクティブなプロファイルを定義するためにSpring Bootのプロパティとして設定することもできます。これは、Spring Bootが自動的に選択する標準的なプロパティです。

spring.profiles.active=dev

プログラムでプロファイルを設定するために、

SpringApplication

クラスを使うこともできます。

SpringApplication.setAdditionalProfiles("dev");

Spring BootでMavenを使用してプロファイルを設定するには、

pom.xmlの

spring-boot-maven-plugin__でプロファイル名を指定できます。

<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <profiles>
                <profile>dev</profile>
            </profiles>
        </configuration>
    </plugin>
    ...
</plugins>

そして、Spring Boot特有のMavenゴールを実行してください。

mvn spring-boot:run

しかし、Spring Bootがもたらす最も重要なプロファイル関連の機能は、

プロファイル固有のプロパティファイル

です。これらは

アプリケーション – \ {profile} .properties

の形式で命名する必要があります。

Spring Bootは、すべてのプロファイルに対して

application.properties

ファイルのプロパティを、指定されたプロファイルに対してのみプロファイル固有の

.properties

ファイルのプロパティを自動的にロードします。

たとえば、

application-dev.properties



application-production.properties

の2つのファイルを使用して、

dev



production

のプロファイルに異なるデータソースを設定できます。


application-production.properties

ファイルで、

MySql

データソースを設定できます。

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=root
spring.datasource.password=root

次に、

application-dev.properties

ファイルの

dev

プロファイルに同じプロパティを設定して、インメモリ

H2

データベースを使用できます。

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB__CLOSE__DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

このようにして、異なる環境に合わせて異なる構成を簡単に提供できます。


9結論

このクイックチュートリアルでは、Beanでプロファイルを定義する

方法と、アプリケーションで正しいプロファイルを有効にする方法

について説明しました。

最後に、私たちはプロファイルの理解を、単純だがそれでも現実世界の例で検証しました。

このSpring Security RESTチュートリアルの実装はhttps://github.com/eugenp/tutorials/tree/master/spring-all[GitHubプロジェクト]にあります – これはMavenベースのプロジェクトなので簡単です。そのままインポートして実行します。