Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Spring】オリジナルの `.properties` ファイルを作成・読み込み

f:id:rennnosukesann:20181220183020p:plain

メモ。

Spring では application.properties 以外に独自の .properties を生成し、その中で定義した値を使用することができます。

オリジナル .properties ファイルの作成とプロパティの参照

例えば、オリジナルのプロパティファイル myconfig.properties を以下のように作成したとします。

myconfig.properties
config.hoge=1
config.fuga='https://www.fuga.com'

config.piyo.foo='foo.'
config.piyo.bar=2

このプロパティファイルの設定をSpring内のコードにマッピングするための、 以下のようなクラスを定義します。

@Configuration
@PropertySource("classpath:myconfig.properties")
@ConfigurationProperties(prefix = "config")
@Getter
public final class MyConfig {

    public static class Piyo {
        private String foo;
        private Integer bar;
    }
    
    private Integer hoge;
    private String fuga;
    private Piyo piyo

}

@PropertySource

指定したクラスにどのプロパティファイルの内容をマッピングするのかを指定します。 上の例では MyConfig クラスに myconfig.properties ファイルをマッピングするよう指定しています。 classpath: はクラスパス配下であることを表し、 myconfig.properties がクラスパスを通したディレクトリ下にあれば良いことを示しています。

@ConfigurationProperties

myconfig.properties でどのようなプレフィックスを受け入れるかを設定しています。ここでは config を指定しているので、MyConfigクラスはmyconfig.properties の各パラメータ名の前に config. を付けることを要求します。

マッピングの定義が完了したMyConfigクラスには @Configuration (@Conponentが付加されたアノテーション)が付加されているので、下記のように他コンポーネントへDIによるインスタンス化を行うことができます。

@Service
public class HogeService {

 private static final Logger logger = LoggerFactory.getLogger(LogUtils.class);

    @Autowired
    private MyConfig config;

    public void printFuga() {
        logger.info(config.getFuga());
    }

}

環境変数を参照する

下記のように @PropertySource に渡すvalue値には外部環境変数への参照を記述することができます。

@PropertySource("classpath:myconfig-${ENV}.properties") // 環境変数を追

これにより、例えばデプロイ環境によって適用したいカスタム properties ファイルの切り替えを行うことが可能です。

参考文献

PropertySource (Spring Framework 5.1.3.RELEASE API)

Configuration (Spring Framework 5.1.3.RELEASE API)