SpringにおけるProptiesの配置方式

5738 ワード

Spring内のProptiesを理解していない開発者は、ちょっと乱れていると感じるかもしれません。主に配置の種類が多く、使い方も様々です。
本文は原理分析ではなく、ソース分析の文章です。読者のより良い理解と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 PlaceholderConfigrer
Spring 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インターフェースに関するソースを理解する必要があります。興味のある読者にソースコードをひっくり返してみてください。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。