読者です 読者をやめる 読者になる 読者になる

山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

【Spring Framework】プロパティファイルを読む①

f:id:yyama1556:20160812103358p:plain

Springでプロパティファイルを扱う方法を紹介する。ややこしいことに[PropertiesFactoryBean]を使う方法と[property-placeholder]を使う方法がある。

まずは[PropertiesFactoryBean]を使う方法を試してみる。

ソース

フォルダ構成。
f:id:yyama1556:20160812103644p:plain

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="org.yyama.hoge" />
	<bean id="prop"
		class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="locations">
			<list>
				<value>classpath:myProp.properties</value>
			</list>
		</property>
	</bean>
</beans>

idを"prop"として、[org.springframework.beans.factory.config.PropertiesFactoryBean]を定義している。

	<bean id="prop"
		class="org.springframework.beans.factory.config.PropertiesFactoryBean">

propertyタグでプロパティファイルの場所を指定している。ここではクラスパス上に存在する"myProp.properties"をプロパティファイルとして指定している。

		<property name="locations">
			<list>
				<value>classpath:myProp.properties</value>
			</list>
		</property>

プロパティファイルの内容は次のとおり。
myProp.properties。

key=value

続いてFugaクラス。

package org.yyama.hoge;

import java.util.Properties;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Fuga {

	@Autowired
	Properties prop;

	public void proc() throws Exception {
		System.out.println("key:" + prop.getProperty("key"));
	}
}

"prop"という変数名でPropertiesクラス型の変数を宣言している。このPropertiesクラスはJava標準のクラスだ。ここに@Autowiredアノテーションを付与することにより、applicationContext.xmlで宣言したPropertiesFactoryBeanのプロパティファイルが自動でインジェクションされる。
"prop"という変数名はapplicationContext.xmlで指定したidと一致している必要がある。

	@Autowired
	Properties prop;

PropertiesFactoryBeanクラスとPropertiesクラスはキャストはできないのだが、なぜかインジェクションされる。 内部でPropertiesFactoryBeanクラスのgetObject()クラスが呼ばれていると思われる。詳しくはJavadoc参照。

最後にMainクラス。特別なことはしていない。

package org.yyama;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.yyama.hoge.Fuga;

public class Main {
	public static void main(String... args) throws Exception {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		ctx.getBean(Fuga.class).proc();
		ctx.close();
	}
}


実行すると次のような出力を得られた。

key:value

このように非常に簡単にプロパティファイルを使用することができる。

今日はここまで。


Spring 関連記事へのリンク集つくりました。