BeanFactoryはSpringの中で最も重要になるクラス。DI(依存性の注入)をBeanFactoryを使ってみてみる。
インスタンスの生成
BeanFactoryとは別にApplicationContextというクラスを使ってBeanを生成することもできる。「どっちを使えばいいのか?」と悩んでしまうが、ドキュメントには以下のように書いていた。
ユーザはBeanFactoryとApplicationContextのどちらが状況に適しているか迷ってしまう。BeanFactoryは大体の場合、インスタンス生成やBeanの設定に使える。ApplicationContextもまた同じで、たくさんのエンタープライズ仕様や、トランザクション処理やAOPといった機能を実現する基盤をサポートしてくれる。ようは、できるだけApplicationContextを使ったほうがいい
XMLBeanFactoryを使う場合
BeanFactoryを実装したXMLBeanFactoryを利用したインスタンス生成。
Resource resource = new ClassPathResource("/com/daipresents/spring204/beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);
Car car = (Car)factory.getBean("car");
ApplicationContextを使う場合
結局BeanFactoryを取得している感じになる。
ApplicationContext context =
new ClassPathXmlApplicationContext("/com/daipresents/spring204/beans.xml");
Car car = (Car)context.getBean("car");
ClassPathXmlApplicationContextのコンストラクタに複数のファイルを指定することもできる。
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[]{"aaa.xml", "bbb.xml"});
XMLBeanFactoryを使ってDIを体感
XMLBeanFactoryを使って「設定を利用から分離する」というDIの概念を勉強。
設定ファイル作成
まずは、設定ファイルを作る。同じクラスを使って、2種類の振る舞いを行ってくれるようにしてみた。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="japan" class="com.daipresents.spring204.test.Message" >
<property name="message" >
<value>こんにちは、世界!</value>
</property>
</bean>
<bean id="usa" class="com.daipresents.spring204.test.Message" >
<property name="message" >
<value>Hello,World.</value>
</property>
</bean>
</beans>
コンポーネント作成
「設定を利用から分離する」という考えを持って、再利用性が高いコンポーネントになるようにコンポーネント設計を行う。これが多分難しいところなのだが、今回はサンプルなので、設定値を変えるだけで、クラスの振る舞いを変えるという簡単なクラスを作ってみた。
単純に自分に設定されたmessageをspeakメソッドでプリントしてくれるクラス。
public class Message {
private String message;
public void speak(){
System.out.println(getMessage());
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
実行クラス作成
用意した設定ファイルからオブジェクトを生成してみる。SpringはWebアプリケーションに特化していないので、mainメソッドから利用することができる。
public class ExecuteMessage {
public static void main(String[] args) {
//リソースを読み込む
Resource resource = new FileSystemResource("D:/daipresents/project/Spring204/conf/beans.xml");
//リソースを元にファクトリを生成
XmlBeanFactory factory = new XmlBeanFactory(resource);
//ファクトリからJavaBeanを生成(依存性の注入)
Message japan = (Message)factory.getBean("japan");
Message usa = (Message)factory.getBean("usa");
//設定を利用から分離することで再利用性が上がり
//コンポーネントとしての独立性が高まる
japan.speak();
usa.speak();
}
}
実行結果は以下のようになる。
こんにちは、世界!
Hello,World.
設定ファイルだけで出力文字列を変えることに成功した。