春のプロフィール

春のプロファイル

1. 概要

この記事では、Profiles in Springの紹介に焦点を当てます。

プロファイルはフレームワークのコア機能であり、Beanをさまざまなプロファイル(devtestprodなど)にマップできます。

その後、さまざまな環境でさまざまなプロファイルをアクティブにして、必要なBeanのみをブートストラップできます。

参考文献:

テスト用の個別のSpring DataSourceの構成

Springアプリケーションでのテスト用に個別のデータソースを構成する方法に関する、迅速で実用的なチュートリアル。

SpringおよびSpring Bootのプロパティ

Springでプロパティファイルとプロパティ値を操作する方法のチュートリアル。

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”属性があり、該当するプロファイルのコンマ区切り値を取ります。


    

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アプリケーションのprofiles can be activated in the web.xml


    contextConfigLocation
    /WEB-INF/app-config.xml


    spring.profiles.active
    dev

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

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

-Dspring.profiles.active=dev

4.5. 環境変数

Unix環境では、profiles can also be activated via the environment variable

export spring_profiles_active=dev

4.6. Mavenプロファイル

Springプロファイルは、spring.profiles.active configurationプロパティを指定することにより、Mavenプロファイルを介してアクティブ化することもできます。

すべてのMavenプロファイルで、spring.profiles.activeプロパティを設定できます。


    
        dev
        
            true
        
        
            dev
        
    
    
        prod
        
            prod
        
    

その値は、application.properties@[email protected]プレースホルダーを置き換えるために使用されます。

[email protected]@

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


    
        
            src/main/resources
            true
        
    
    ...

そして、-Pパラメータを追加して、適用するMavenプロファイルを切り替えます。

mvn clean package -Pprod

このコマンドは、prodプロファイルのアプリケーションをパッケージ化します。 また、実行時にこのアプリケーションに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. アクティブなプロファイルを取得する

Springのアクティブなプロファイルは、Beanを有効/無効にするための@Profileアノテーションの動作を駆動します。 ただし、アクティブなプロファイルのリストにプログラムでアクセスすることもできます。

これを行うには、using Environment or*spring.active.profile*.の2つの方法があります。

6.1. Environmentの使用

Environmentオブジェクトを挿入することにより、アクティブなプロファイルにアクセスできます。

public class ProfileManager {
    @Autowired
    private Environment environment;

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

6.2. spring.active.profileの使用

または、プロパティspring.profiles.activeを挿入して、プロファイルにアクセスすることもできます。

@Value("${spring.profiles.active}")
private String activeProfile;

ここでは、activeProfile変数will contain the name of the profile that is currently active,があり、複数ある場合は、名前がカンマで区切られて含まれます。

ただし、consider what would happen if there is no active profile at allにする必要があります。 上記のコードでは、アクティブなプロファイルがないと、アプリケーションコンテキストが作成されません。 これにより、変数に挿入するためのプレースホルダーが欠落しているため、IllegalArgumentExceptionになります。

これを回避するために、define a default valueを実行できます。

@Value("${spring.profiles.active:}")
private String activeProfile;

これで、アクティブなプロファイルがない場合、activeProfileには空の文字列が含まれます。 そして、前の例のようにそれらのリストにアクセスしたい場合は、splittingactiveProfile変数によってアクセスできます。

public class ProfileManager {
    @Value("${spring.profiles.active:}")
    private String activeProfiles;

    public String getActiveProfiles() {
        for (String profileName : activeProfiles.split(",")) {
            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またはProductionDatasourceConfigBeanを注入します。

public class SpringProfilesWithMavenPropertiesIntegrationTest {
    @Autowired
    DatasourceConfig datasourceConfig;

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

dev」プロファイルがアクティブな場合、スプリングはDevDatasourceConfigオブジェクトを注入し、setup()メソッドを呼び出すと次のように出力されます。

Setting up datasource for DEV environment.

8. SpringBootのプロファイル

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

セクション4で導入された初期化パラメーターspring.profiles.activeは、現在アクティブなプロファイルを定義するためにSpringBootのプロパティとして設定することもできます。 これは、Spring Bootが自動的に取得する標準プロパティです。

spring.profiles.active=dev

プログラムでプロファイルを設定するには、SpringApplicationクラスを使用することもできます。

SpringApplication.setAdditionalProfiles("dev");

Spring BootでMavenを使用してプロファイルを設定するには、pom.xml:spring-boot-maven-pluginでプロファイル名を指定できます。


    
        org.springframework.boot
        spring-boot-maven-plugin
        
            
                dev
            
        
    
    ...

そして、Spring Boot固有のMavenゴールを実行します。

mvn spring-boot:run

しかし、Spring Bootがもたらす最も重要なプロファイル関連の機能はprofile-specific properties filesです。 これらは、applications-{profile}.propertiesの形式で名前を付ける必要があります。

Spring Bootは、すべてのプロファイルのapplication.propertiesファイルのプロパティと、指定されたプロファイルのプロファイル固有の.propertiesファイルのプロパティを自動的にロードします。

たとえば、application-dev.propertiesapplication-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でdefine a profileを実行する方法と、アプリケーションでenable the right profilesを実行する方法について説明しました。

最後に、シンプルでありながら実際の例を使用して、プロファイルの理解を検証しました。

このSpringSecurity RESTチュートリアルの実装はthe GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。