リソースクラスを拡張する方法
Springがロードされると時にプロパティファイルを読み込んでくれるクラスと同じ感じで、
プロパティファイル以外でもロード時に読み込んでくれるクラスがないかなぁと思ったのですが、
なかったので、自作クラスを作ることにしました。
Springに用意されているBeanClassLoaderAwareインターフェイスを実装したクラスを
作成するとSpringがロードされたタイミングで、
ファイルを読み込んでくれるクラスを作ることができます。
それで、ファイルを読み込む時に独自処理で、拡張できるように、
基本的な処理部分を抽象クラスとしました。
BeanClassLoaderAwareインターフェイスを実装した抽象クラスは、下記になります。
import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.util.ClassUtils; public abstract class AbstractFileResource implements BeanClassLoaderAware { // ベースネーム protected String[] basenames = new String[0]; // クラスローダー protected ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); /** * ベースネーム設定 */ public void setBaesname(String basename) { setBasenames(new String[] {base name}); } /** * ベースネーム設定 */ public void setBasenames(String[] basenames) { if (basenames != null) { this.basenames = new String[basenames.length]; for (int i = 0; i < basenames.length; i++) { String basename = basenames[i]; this.basenames[i] = basename.trim(); } } } /** * クラスローダー設定 */ public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = (class loader != null ? classLoader : ClassUtils.getDefaultClassLoader()); } }
この抽象クラスは、SpringのapplicationContextファイルが読み込まれる時に、
設定してあるファイルパスを保持してくる処理が記載してある抽象クラスです。
この抽象クラスを継承して、ファイルを読み込む及び、独自処理を定義するクラスを作成します。
まず、インターフェイスを定義します。
インターフェイスは、ファイル及び、ファイルリストを戻すメソッドを定義します。
public interface FileResource { /** * ファイル取得 */ FIle getFile(); /** * ファイルリスト取得 */ File[] getFiles(); }
それで、実際の実装クラスですが、
保持されているファイルパスからファイルを読み込んでFileオブジェクトとして戻しています。
public class FileResourceBoundle extends AbstractFileResource implements FileResource { public FIle getFile() { URL url = this.beanClassLoader.getResource(this.basenames[0]); if (url != null) { return new File(url.getFile()); } return null; } public File[] getFiles() { File[] files = new Files[this.basenames.length]; for (int i = 0; i < this.basenames.length; i++) { URL url = this.beanClassLoader.getResource(this.basenames[i]); if (url != null) { files[i] = new File(url.getFile()); } else { return null; } } return files; } }
SpringのapplicationContextファイルの定義ですが、下の様に定義をファイルに追加します。
<bean id="fileResource" class="jp.co.chronos.system.base.resources.FileResourceBundle" scope="singleton"> <property name="basename"> <list> <value>resource/sample.txt</value> </list> </property> </bean>
ファイルパスですが、クラスパスのルート以下のパスを定義しておきます。
これで、Springがロードされた時に、定義されているパスをクラスパスから自動的に探して、
ファイルを読み込んでくれます。