練習の過程で、異なる環境での我々しばしば遭遇状況が異なるプロファイルを必要とし、変更のための各再編集する場合は、設定ファイルや再パッケージは、多くの問題だろうと、春ブーツは、この問題を解決するために、プロファイルの設定を提供することを目的とします。
プロフィール役割
対応する中国となし、適切な翻訳をプロフィール、その主な役割は、春のブート構成は、環境に応じて、異なるサポート機能を提供することができますようにすることです。
私たちはしばしば、このシナリオが発生します。開発、テスト、本番環境があり、異なる環境は異なる構成を有します。すべての環境ならば非常に面倒になり、設定ファイルを変更する必要性を展開するとき、あなたは簡単にプロフィールを変更することで問題を解決することができます。
プロフィールの基本的な使用
例えば、上記の環境では、我々は春ブーツで4つのファイルを作成することができます。
- applcation.properties:一般的な構成
- application-dev.properties:開発環境の設定
- application-test.properties:テスト環境の設定
- application-prod.properties:本番環境の設定
Applcation.propertiesは、一般的な構成で配置され、その後、環境設定で指定されたコンフィギュレーションをアクティブにします。
spring.profiles.active = prod
どこに「PROD」制御ファイル名application-prod.properties。その後、「PROD」のプロファイルの値を指定することにより、スプライシングされたコンフィギュレーション・ファイルapplcation.properties、を扱うときに春ブーツ取得します、ファイルapplication-prod.propertiesの名前とパスを取得します。
そのような8080のためのサービスを使用して、ポートの開発環境としてイラスト、が、ポート18080を使用するには、本番環境の必要性インチ その後、次のようにapplication-prod.propertiesで構成されました:
server.port=8080
application-prod.propertiesでの構成:
server.port=18080
異なる環境を使用する場合、(上記の例のように)指定することができ、属性値applcation.propertiesがでspring.profiles.active構成を使用して、起動コマンドで指定されてもよいです。
java -jar springboot.jar --spring.profiles.active=prod
手順はとてもラインパラメータを詰めた後にのみ、あなたはコマンド環境から別の設定ファイルを使用することができます。
ファイルの種類に基づいてYML
プロファイルはYMLファイルの種類に基づいている場合、あなたはまた、同じ構成ファイル内のすべてを設定できます。
spring:
profiles:
active: prod
server:
port: 18080
---
spring:
profiles: dev
server:
port: 8080
---
spring:
profiles: test
server:
port: 8081
上記構成において、「---」は、上述した構成として第1のプロファイルのデフォルトの位置は、デフォルトのポート18080を使用して、開始されており、分割されています。あなたが指定したポートでも使用することができます使用したい場合には、上のコマンドを指定します。
ソース決意
ここで私達とプロフィールの基本的なプロセスフローに対する春ブートで簡単に見ては、(過度に特定の操作を洗練されていません)。スタートスプリングブート時にその実行を行う方法は、次のコードが実行されます。
public ConfigurableApplicationContext run(String... args) {
// ...
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
// ...
}
// ...
}
次のように関連するコードprepareEnvironment方法であることを特徴とします。
private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments) {
// ...
listeners.environmentPrepared(environment);
// ...
}
処理サービスの過程でprepareEnvironmentメソッドは、イベントを公開するSpringApplicationRunListeners environmentPreparedメソッドを呼び出します。この方法は、そのenvironmentPreparedメソッドを呼び出し、SpringApplicationRunListenerでspring.factoriesに登録実装クラスをトラバースします。
登録SpringApplicationRunListener実装クラスでどのspring.factories:
# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
次のようにコードSpringApplicationRunListenersメソッドを呼び出します:
void environmentPrepared(ConfigurableEnvironment environment) {
for (SpringApplicationRunListener listener : this.listeners) {
listener.environmentPrepared(environment);
}
}
これはデフォルトでは唯一EventPublishingRunListenerで登録されたリスナークラスのコレクションです。これは、メソッドは次のように実装されてenvironmentPrepared:
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
this.initialMulticaster
.multicastEvent(new ApplicationEnvironmentPreparedEvent(this.application, this.args, environment));
}
実際には、リスニングイベントをリリースしました。イベントはを聞いConfigFileApplicationListenerで同じspring.factoriesに登録されます。
# Application Listeners
org.springframework.context.ApplicationListener=\
// ...
org.springframework.boot.context.config.ConfigFileApplicationListener
// ...
設定ファイルに対するコア処理がでConfigFileApplicationListenerに完成する予定。このクラスでは、我々はおなじみの定数の多くを見ることができます。
public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
private static final String DEFAULT_PROPERTIES = "defaultProperties";
// Note the order is from least to most specific (last one wins)
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
private static final String DEFAULT_NAMES = "application";
// ...
}
例えば、デフォルトのクラスパスのスキャンなどの構成ファイルの検索、の春ブーツのデフォルト名。
だけでなく、クラスが実装リスナーSmartApplicationListenerインターフェースとインターフェースがEnvironmentPostProcessorは、リスナー関数と環境のプロセスを持つことでもある、ということ。
次のようにイベントがApplicationEnvironmentPreparedEventがコードを処理するためonApplicationEnvironmentPreparedEventメソッドを呼び出している場合は、受信したイベントを判断するために、そのonApplicationEvent方法は次のとおりです。
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);
}
if (event instanceof ApplicationPreparedEvent) {
onApplicationPreparedEvent(event);
}
}
取得及び処理のためにその対応EnvironmentPostProcessor postProcessEnvironmentメソッドを呼び出すことonApplicationEnvironmentPreparedEvent。loadPostProcessors方法は正確に現在のクラスでspring.factoriesで構成されたEnvironmentPostProcessorを取得します。
private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {
List<EnvironmentPostProcessor> postProcessors = loadPostProcessors();
postProcessors.add(this);
AnnotationAwareOrderComparator.sort(postProcessors);
for (EnvironmentPostProcessor postProcessor : postProcessors) {
postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());
}
}
最終的にはクラスの以下のメソッドを呼び出すための一連の呼び出し後:
protected void addPropertySources(ConfigurableEnvironment environment, ResourceLoader resourceLoader) {
RandomValuePropertySource.addToEnvironment(environment);
new Loader(environment, resourceLoader).load();
}
解析機能をロード、優先順位、プロファイルを処理する特定の構成ファイルを提供する、請求ローダクラスConfigFileApplicationListener内部クラス。
例えば、負荷方法でLoaderクラスは、次のコードを有することになります。
for (PropertySourceLoader loader : this.propertySourceLoaders) {
if (canLoadFileExtension(loader, location)) {
load(loader, location, profile, filterFactory.getDocumentFilter(profile), consumer);
return;
}
}
コードPropertySourceLoaderトラバーサルリスト、及び対応する設定ファイルを解析し、spring.factories PropertySourceLoader中で同じ構成で本明細書にリスト:
# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader
どちらPropertySourceLoaderは、ソースコードを表示するには、デフォルトでサポートされている設定ファイルの形式や解像度方法SpringBootがあります。
public class PropertiesPropertySourceLoader implements PropertySourceLoader {
private static final String XML_FILE_EXTENSION = ".xml";
@Override
public String[] getFileExtensions() {
return new String[] { "properties", "xml" };
}
@Override
public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
Map<String, ?> properties = loadProperties(resource);
// ...
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private Map<String, ?> loadProperties(Resource resource) throws IOException {
String filename = resource.getFilename();
if (filename != null && filename.endsWith(XML_FILE_EXTENSION)) {
return (Map) PropertiesLoaderUtils.loadProperties(resource);
}
return new OriginTrackedPropertiesLoader(resource).load();
}
}
例えばPropertiesPropertySourceLoaderサポートとXML構成ファイル特性の両方をそれぞれの形式、および提供する2つのクラスのためPropertiesLoaderUtilsをOriginTrackedPropertiesLoaderと対応する処理を行います。
同じYamlPropertySourceLoaderサポートプロファイルとYML YAMLフォーマットとOriginTrackedYamlLoaderクラスを使用して解析されました。
public class YamlPropertySourceLoader implements PropertySourceLoader {
@Override
public String[] getFileExtensions() {
return new String[] { "yml", "yaml" };
}
@Override
public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
// ...
List<Map<String, Object>> loaded = new OriginTrackedYamlLoader(resource).load();
// ...
}
}
次のようにもちろん、また、どのように上記のデフォルトのプロファイルとプロファイルを達成するためにConfigFileApplicationListenerクラスが実装スプライシングに、関連するコードは次のようになります。
private void loadForFileExtension(PropertySourceLoader loader, String prefix, String fileExtension,
Profile profile, DocumentFilterFactory filterFactory, DocumentConsumer consumer) {
// ...
if (profile != null) {
String profileSpecificFile = prefix + "-" + profile + fileExtension;
load(loader, profileSpecificFile, profile, defaultFilter, consumer);
load(loader, profileSpecificFile, profile, profileFilter, consumer);
// Try profile specific sections in files we've already processed
for (Profile processedProfile : this.processedProfiles) {
if (processedProfile != null) {
String previouslyLoaded = prefix + "-" + processedProfile + fileExtension;
load(loader, previouslyLoaded, profile, profileFilter, consumer);
}
}
}
// ...
}
ConfigFileApplicationListenerクラスは、他の多くの機能を実装して、誰も興味を持って、デバッグを読み取ることができます。
オリジナルリンク:「SpringBootプロファイルが使用する詳細な構成およびソースコードの解析」
春テクノロジーのビデオ
CSDN研究所:「春のブートビデオチュートリアル家族のバケット」