春のプロファイル
1. 概要
この記事では、Profiles in Springの紹介に焦点を当てます。
プロファイルはフレームワークのコア機能であり、Beanをさまざまなプロファイル(dev、test、prodなど)にマップできます。
その後、さまざまな環境でさまざまなプロファイルをアクティブにして、必要な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”属性があり、該当するプロファイルのコンマ区切り値を取ります。
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")
要約すると、プロファイルをアクティブ化する複数の方法を検討しました。 次に、どちらが優先されるか、および複数を使用するとどうなるかを見てみましょう。
-
web.xmlのコンテキストパラメータ
-
WebApplicationInitializer
-
JVMシステムパラメータ
-
環境変数
-
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には空の文字列が含まれます。 そして、前の例のようにそれらのリストにアクセスしたい場合は、splitting、activeProfile変数によってアクセスできます。
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.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でdefine a profileを実行する方法と、アプリケーションでenable the right profilesを実行する方法について説明しました。
最後に、シンプルでありながら実際の例を使用して、プロファイルの理解を検証しました。
このSpringSecurity RESTチュートリアルの実装はthe GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。