SpringにおけるProptiesの配置方式
Spring内のProptiesを理解していない開発者は、ちょっと乱れていると感じるかもしれません。主に配置の種類が多く、使い方も様々です。
本文は原理分析ではなく、ソース分析の文章です。読者のより良い理解とSpring Proptiesの使用を助けたいです。
Proptiesの使用
本文の読者はSpringを使ったことがあります。まずProptiesはどうやって使うのかを見てみます。Springでよく使われているのは以下のような使い方です。
1.xmlプロファイルで使用する
の中の値を自動的に置換します。
この方法には注意すべき点があります。すべての配置がEvironmentインターフェースを通じて属性値を取得することをサポートしているわけではなく、コメント@ProptySourceを使う時だけ使えます。そうしないとnullがもらえます。どのように配置されているかはすぐに説明します。
Propties設定
前に私達は私達が配置したProptiesをどう使うかと言いましたが、どう配置すればいいですか?Springは多くの構成を提供しています。
1.xmlでの設定
これは一番よく使われている配置方式です。多くの項目はこのように書きます。
前の配置はxmlでよく使われていますが、もしあなたがすべてのxmlプロファイルを消滅させる衝動があるなら、以下の方法を使います。
3.PropertyPlace HolderConfigrer
もし読者がこれを見たことがあるならば、同じくおかしく思う必要はなくて、Spring 3.1前に、いつもこのように使います:
Spring 3.1になると、PropertySources Place holderConfigrerが導入されています。これは新しいクラスです。前のProptyPlace holderConfigrerと名前の上にSourcesが一つ増えています。所属のカバンも違っています。Spring-Contextの中にあります。
配置には違いがないです。
Spring Bootは本当にいいものです。開梱すると使う感じが本当にいいです。ここで簡単に紹介します。
速くSpring Boot項目を生成します。https://start.spring.io/
appication.properties
私たちは各項目にデフォルトでappication.propertiesファイルがあります。このプロファイルは前に述べたように登録する必要がありません。Spring Bootは自動的に登録してくれます。
もちろん、名前を変えたいかもしれません。起動時にファイル名を指定すればいいです。
異なる環境に異なる配置を指定するために、これを使います。
例えば、テスト環境と生産環境のデータベース接続情報は違っています。
だから、appication.propertiesに基づいて、私達はまた新しいappication-dev.propertiesとappication-prd.propertiesを必要として、環境に関する情報を配置して、それから起動する時に環境を指定します。
@ConfigrationPropties
この注釈はSpring Bootにしかない。
このコメントを使わなくても、オープンソースでこれを見られるかもしれません。ここで簡単に紹介します。
例をあげて少し直観する。前に述べたように、設定ファイルに下記の情報を記入して、appication.propertiesに書き込む方法を選択してもいいです。
起動中に属性値を動的に変更します。
これはあまり紹介する必要がないと思います。Spring Bootを使うのは大体知っているはずです。
属性の配置にはカバー順序があります。つまり同じkeyが現れたら、どこの値を基準にしますか?
起動パラメータ>appication-{env}.properties>appication.properties
起動パラメータ動的設定属性:
締め括りをつける
読者がSpringのPropertiesをもっと深く知るためには、SpringのEvironmentインターフェースに関するソースを理解する必要があります。興味のある読者にソースコードをひっくり返してみてください。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
本文は原理分析ではなく、ソース分析の文章です。読者のより良い理解とSpring Proptiesの使用を助けたいです。
Proptiesの使用
本文の読者はSpringを使ったことがあります。まずProptiesはどうやって使うのかを見てみます。Springでよく使われているのは以下のような使い方です。
1.xmlプロファイルで使用する
の中の値を自動的に置換します。
<bean id="xxx" class="com.javadoop.Xxx">
<property name="url" value="${javadoop.jdbc.url}" />
</bean>
2.@Value注入による使用
@Value("${javadoop.jdbc.url}")
private String url;
3.Evironmentで取得するこの方法には注意すべき点があります。すべての配置がEvironmentインターフェースを通じて属性値を取得することをサポートしているわけではなく、コメント@ProptySourceを使う時だけ使えます。そうしないとnullがもらえます。どのように配置されているかはすぐに説明します。
@Autowired
private Environment env;
public String getUrl() {
return env.getProperty("javadoop.jdbc.url");
}
Spring Bootのaplication.propertiesで登録すればいいです。Propties設定
前に私達は私達が配置したProptiesをどう使うかと言いましたが、どう配置すればいいですか?Springは多くの構成を提供しています。
1.xmlでの設定
これは一番よく使われている配置方式です。多くの項目はこのように書きます。
<context:property-placeholder location="classpath:sys.properties" />
2.@ProptySourceで配置する前の配置はxmlでよく使われていますが、もしあなたがすべてのxmlプロファイルを消滅させる衝動があるなら、以下の方法を使います。
@PropertySource("classpath:sys.properties")
@Configuration
public class JavaDoopConfig {
}
注意してください。@ProptySourceはここで@Configrationと組み合わせて使わなければなりません。具体的には展開しません。3.PropertyPlace HolderConfigrer
もし読者がこれを見たことがあるならば、同じくおかしく思う必要はなくて、Spring 3.1前に、いつもこのように使います:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:sys.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<!-- -->
</bean>
もちろん、私達も相応のjava configrationのバージョンを使うことができます。
@Bean
public PropertyPlaceholderConfigurer propertiess() {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
Resource[] resources = new ClassPathResource[]{new ClassPathResource("sys.properties")};
ppc.setLocations(resources);
ppc.setIgnoreUnresolvablePlaceholders(true);
return ppc;
}
4.PropertySources PlaceholderConfigrerSpring 3.1になると、PropertySources Place holderConfigrerが導入されています。これは新しいクラスです。前のProptyPlace holderConfigrerと名前の上にSourcesが一つ増えています。所属のカバンも違っています。Spring-Contextの中にあります。
配置には違いがないです。
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:sys.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<!-- -->
</bean>
java configrationバージョンも一つください。
@Bean
public PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
Resource[] resources = new ClassPathResource[]{new ClassPathResource("sys.properties")};
pspc.setLocations(resources);
pspc.setIgnoreUnresolvablePlaceholders(true);
return pspc;
}
Spring Boot関連Spring Bootは本当にいいものです。開梱すると使う感じが本当にいいです。ここで簡単に紹介します。
速くSpring Boot項目を生成します。https://start.spring.io/
appication.properties
私たちは各項目にデフォルトでappication.propertiesファイルがあります。このプロファイルは前に述べたように登録する必要がありません。Spring Bootは自動的に登録してくれます。
もちろん、名前を変えたいかもしれません。起動時にファイル名を指定すればいいです。
java -Dspring.config.location=classpath:sys.properties -jar app.jar
appication-{env}.properties異なる環境に異なる配置を指定するために、これを使います。
例えば、テスト環境と生産環境のデータベース接続情報は違っています。
だから、appication.propertiesに基づいて、私達はまた新しいappication-dev.propertiesとappication-prd.propertiesを必要として、環境に関する情報を配置して、それから起動する時に環境を指定します。
java -Dspring.profiles.active=prd -jar app.jar
その結果、appication.propertiesとappication-prd.propertiesの両方のファイルの構成が登録されます。重複したkeyがあれば、appication-prd.propertiesファイルの優先度が高いです。@ConfigrationPropties
この注釈はSpring Bootにしかない。
このコメントを使わなくても、オープンソースでこれを見られるかもしれません。ここで簡単に紹介します。
例をあげて少し直観する。前に述べたように、設定ファイルに下記の情報を記入して、appication.propertiesに書き込む方法を選択してもいいです。
javadoop.database.url=jdbc:mysql:
javadoop.database.username=admin
javadoop.database.password=admin123456
javaファイル:
@Configuration
@ConfigurationProperties(prefix = "javadoop.database")
public class DataBase {
String url;
String username;
String password;
// getters and setters
}
このようにSpringの容器の中で自動的にDataBaseのbeanタイプを登録しました。そして属性は全部セットしました。起動中に属性値を動的に変更します。
これはあまり紹介する必要がないと思います。Spring Bootを使うのは大体知っているはずです。
属性の配置にはカバー順序があります。つまり同じkeyが現れたら、どこの値を基準にしますか?
起動パラメータ>appication-{env}.properties>appication.properties
起動パラメータ動的設定属性:
java -Djavadoop.database.password=admin4321 -jar app.jar
また、システム環境変数を利用して属性を設定したり、乱数を指定したりするなど、確かに柔軟ですが、あまり役に立たないので、紹介しません。締め括りをつける
読者がSpringのPropertiesをもっと深く知るためには、SpringのEvironmentインターフェースに関するソースを理解する必要があります。興味のある読者にソースコードをひっくり返してみてください。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。