春のプロフィール
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")
まとめると、プロファイルを有効にする方法は複数あります。ここで、どちらがもう一方よりも優先されるのか、また、複数を使用した場合に何が起こるかを見てみましょう – 最高から最低の優先順位へ
-
web.xml
のコンテキストパラメータ -
WebApplicationInitializer
-
JVMシステムパラメータ
-
環境変数
-
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ベースのプロジェクトなので簡単です。そのままインポートして実行します。