• 2019年5月4日土曜日
アリスト戦記
アリスト戦記 https://blog.aristo-solutions.net/2019/05/javatemplatebatchspringboot_4.html

SpringBootを活用した任意プロパティファイルの読み込み

SpringBootというのは、特に何もしなくてもデフォルトで「application.properties」が読み込まれ、各所にDI(依存性注入)される。

しかし、場合に依っては、全ての外部定義情報が「application.properties」に終結されると保守性という面でイマイチな時がある。

例えば、application.propertiesにはDB接続のパラメータとか、システムの挙動を変えるスイッチとかを入れたい。
でも、メッセージ定義とかまで全部application.propertiesにぶっこんでしまうと、ちょっとapplication.propertiesが肥大化し過ぎかなぁ、みたいな。

だから、application.propertiesとは別にプロパティファイルを用意して、メッセージ定義専用プロパティにしたい、とか、そういう需要がある。

そんな風に、「application.propertiesとは別に、指定した任意のプロパティファイルを読み込んで使いたい」という場合の実装方法を解説しよう。

プロパティファイル作成

イメージとしては、メッセージ専用プロパティを作るというもの。

こんな感じにプロパティファイルを作る。



命名は「messageResource.properties」だから、このままだとSpringBootからは素通りされてします。
だから「messageResource.properties」にパスを通す必要がある。

それをやるには「@PropertySource」というアノテーションを使うんだ。

読み込みクラス作成

プロパティファイルを読み込んでくれるソースはこんな感じ。

@Configuration
@PropertySource("classpath:/messageResource.properties")
public class MessageResource {

   /** 環境読み込み */
   @Autowired
   private Environment env;

   public String getValue(String key) {

      return env.getProperty(key);
   }

}


これで「Environment」にプロパティファイルが読み込まれている。

動作確認

では、実際に呼んでみよう。

@SpringBootApplication
public class PropertySampleExecuter extends AbstractExecuter {

   /** logger */
   private static final Logger logger = LoggerFactory.getLogger(PropertySampleExecuter.class);

   /** String型のセット検証 */
   @Autowired
   private MessageResource messageResource;

   /**
    * 処理実行
    *
    * @param args 入力引数
    * @throws Exception
    */
   public static void main(String[] args) throws Exception {

      ConfigurableApplicationContext context = SpringApplication.run(App.class, args);

      PropertySampleExecuter exe = context.getBean(PropertySampleExecuter.class);
      exe.start(args);

   }

   /* (非 Javadoc)
    * @see net.aristo.template.batch.exe.AbstractExecuter#doStart(java.lang.String[])
    */
   @Override
   public void doStart(String[] args) {

      logger.info("valueSampleString={}", messageResource.getValue("I0001"));

   }

}

このソースを実行すると、ちゃんと「ぽこんち」と表示された。
これで基本的な部分はOKだ。

応用編

後は単なる工夫の世界だけど、

  • I0002=%sを出力しています。

という感じに文章に変数を持たせたい場合があるじゃない?
こういう場合は、以下のようにMessageResource.javaの方に置換機能を持たせればOK。

   public String getValue(String key, String str) {

      return String.format(env.getProperty(key), str);

   }

こういう風に「application.propertiesからDI注入する」というやり方だと、注入される値は固定になっちまうから、ロジック的な置換機能を持たせることは出来ない。

一方、@PropertySourceを使ったやり方だと、取れた瞬間は元々の文字列がそのままあるだけってのは変わらないんだけど、メソッドの中で取れるから「置換」とか「変換」とか、そういうのが自由に出来る。

柔軟性を持たせられるわけだ。

まあ、余り柔軟にやり過ぎるとかえってゴチャゴチャになってしまうから匙加減の問題なんだけど、メッセージくらいならこのやり方で丁度良いのではないかと思う。

0 件のコメント:

コメントを投稿