Spring プロパティをコレクション型でバインドする方法
Springの型変換はPropertyEditorがいい感じにやってくれている。
Stringやint、booleanなんかは普通に書けばバインドできますが、コレクション型のバインド方法を調べたのでメモ。
List型変数にバインド
#application.properties
str={'s1','s2','s3'}//Hoge.java @Value("#{${str}}") private List<String> strList; //String[] strArr として配列にもバインド可能
Map型変数にバインド
#application.properties
str={k1:'s1',k2:'s2',k3:'s3'}
#String以外も扱える
#keyをシングルクォートで囲ってもOK
num={'k1':'100','k2':'200','k3':'300'}//Hoge.java @Value("#{${str}}") private Map<String,String> strMap; @Value("#{${num}}") private Map<String,Integer> numMap;
便利ですなー。
以上!
Spring Map型のbeanをDIしたい場合
Springの勉強でつまったところをメモ。
フィールドインジェクションのアノテーションで
・@Autowired
・@Inject
・@Resource
ってのがあります。
大体似たような動きをするので、あんまり意識して使い分けていなかった(現場のしきたりに合わせていた)のですが
細かい部分では異なる動きをするらしい。(当たり前か・・・)
※今回のトピックとは直接関係ありませんが勉強になった記事
qiita.com
コレクション型のbeanをフィールドインジェクションしたい場合
@Autowired,@Injectは使用できない。@Resourceを使うこと。
~~~ @Resource private Map<String,Fuga> fugaMap; fugaMap.get("01").fugaMethod(); ~~~
beanConf.xml
~~~ <bean id="fuga01" class="com.example.hoge.fuga01" /> <bean id="fuga02" class="com.example.hoge.fuga02" /> <bean id="fugaMap" class="org.springframework.beans.factory.config.MapFactoryBean"> <property name="sourceMap"> <map> <entry key="01" value-ref="fuga01"/> <entry key="02" value-ref="fuga02"/> </map> </property> </bean> ~~~
bean定義のポイント
・他のbeanを参照してbean定義する場合は value-refで対象のbean名を指定する。
・Map型のbeanを定義してインジェクションする場合はMapFactoryBeanを利用すると楽。
・インジェクションする先のフィールドには@Resourceアノテーションを付けること。@Autowired,@Injectは不可。
※コレクション型のbean定義について参考になった記事
ocs.hatenadiary.org
ちなみに
Map型beanのkeyを任意の値にしたい要件がなければ、もっと簡単にインジェクションできます。
Hoge.java
~~~ @Inject private Map<String,Fuga> fugaMap; fugaMap.get("fuga02").fugaMethod(); ~~~
beanConf.xml
~~~ <bean id="fuga01" class="com.example.hoge.fuga01" /> <bean id="fuga02" class="com.example.hoge.fuga02" /> ~~~
MapFactoryBeanを使った場合はkeyを任意の値に指定できますが、上記のようにするとfuga01,fuga02のbeanIDをkeyとして自動でインジェクションしてくれます。
key=beanIDで良い場合はこちらのほうが簡潔に書けますね。
以上!
人を信用できない
最近よく思うことなんですが、私は人を信用するのが苦手みたいです。
疑り深くて、些細な事で勘ぐってしまう癖があります。
そして実際その勘が悪い意味で当たってしまった経験があるので、より一層悪癖が補強されてしまっています。
仕事くらい明確な利害のある関係であれば、決まったルールの中で与えて、受け取るだけなのでいいんですが
プライベートの関係、特に深い仲になった場合にこの癖が悪さをします。
自分が大切に思っている相手に嘘をつかれた時、あーやっぱり、と思ってしまう。
その時点でその人との間に線を引いてしまう。
積み重なると、次第にその人への興味が無くなってしまう。
人を信じるというのは自身の願望でもあると思います。
こうして欲しい、こうあって欲しいという願望です。
ただやっぱり、他人に何かをして欲しいなんていうのは土台無理な話です。
他人に期待せず、自分が出来る事を淡々とやっていくしかないんだと思います。
そう考えると寂しくなってしまうんですけどね。
それなりに期待して、それなりに愛情を持って相手と接することができればそれでいいんだと思うんですが
どうも私はそれができません。
程々出来たらきっと今より数段楽になれるのにとよく思います。
なんだかんだ言っても私は寂しがりで、生きる意味を外に依存している人間です。
自分一人で生活することはできますが、そうする意味が分かりません。
そうして誰かを信じて、また失望してという繰り返しです。
でも最近いい事を考えました。
いつか犬を飼うんです。
犬と二人で暮らすのはきっと楽しいと思うんです。
まあ、実家で飼っていたのは猫なので、犬との暮らしぶりは想像上のものでしかないんですが・・・。
Java tar.gzファイルを解凍してデータを読み込む
UNIX系ではおなじみらしいtar.gzファイルの解凍について。
javaでやる場合は外部ライブラリを使うのがいいらしい。
以下、Javaの外部ライブラリ Apache Commons Compressを利用した、tar.gzファイルの解凍手順。
Apache Commons Compress
サンプルコード
tar.gzの場合はtar形式にアーカイブ化したものをgz形式で圧縮しているので、2段構えで処理します。
//try-with-resources try (InputStream fi = Files.newInputStream(Paths.get("xxx.tar.gz")); //GzipCompressourInputStreamでgzファイルのストリームを取得 InputStream gzi = new GzipCompressorInputStream(bi); //TarArchiveInputStreamでtarファイルのストリームを取得 ArchiveInputStream ais= new TarArchiveInputStream(gzi)) { ArchiveEntry entry; //エントリがなくなるまでループ ※エントリ=アーカイブ内のファイル while((entry = ais.getNextEntry() != null)){ //エントリを操作する際、ファイルとディレクトリを区別する必要があります if(entry.isDirectory()) continue; //エントリからファイル名を取得 System.out.println(entry.getName()); //エントリからバイトデータを読み込み、文字列に変換 System.out.println(new String(ais.readAllBytes(),"UTF-8")); } }
実行結果
・圧縮前ファイル

・処理結果

おしまい
入出力関連はよくわからんって感じで苦手です。
読み込んだデータをあれこれしたい場合は同じくCommons CompressのIOUtilsを使うといいんだってさ~~。