今回は、BeanFactoryAwareインターフェースについてです。このインターフェースはvoid setBeanFactory(BeanFactory factory)というメソッドを1つ備えただけの単純なインターフェースです。
最初に言っておくと、このインターフェースはめったに使いません。というか使わなければならなくなったら、本当に使わなければならないのだろうか?としっかり考えた上で使うことが必要です。
このインターフェースを実装したクラスをSpringが見つけると、setBeanFactoryメソッドからBeanFactoryのインスタンスを渡してくれます。つまり、BeanFactoryをがりがり使って色んなステキなことが出来そうな気がします。
ただし、Springにがっつり依存してしまうことになるので、POJOに比べて格段にテストしにくいものになってしまいます。大体のケースでは、きっともっといい方法があるはずなので、使う時は慎重に。
ということで使ってみよう。「springaware」というプロジェクトを作ってSpring Framework 2.5のライブラリを追加します。
そして、springaware.SpringDependBeanを作成します。このクラスにBeanFactoryAwareインターフェースを実装しちゃいます。
package springaware;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
public class SpringDependBean implements BeanFactoryAware {
private BeanFactory factory;
public void setBeanFactory(BeanFactory factory) throws BeansException {
this.factory = factory;
}
public void printValue() {
// ファクトリからvalueという名前で登録されているものをプリントする
System.out.println("value: " + factory.getBean("value"));
}
}
そして、Springの定義ファイルを書きます。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- このInteger型を印字する -->
<bean id="value" class="java.lang.Integer">
<constructor-arg type="int" value="100" />
</bean>
<bean id="awareBean" class="springaware.SpringDependBean" />
</beans>
後は、いつもどおりApplicationContextを作ってgetBeanでインスタンスを取得して使えます。
package springaware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
SpringDependBean bean = (SpringDependBean) ctx.getBean("awareBean");
bean.printValue(); // value: 100と表示される
}
}
簡単ですね。