ApplicationContext

Spring には BeanFactory を拡張し、多機能化した ApplicationContext が用意されています。ApplicationContext は BeanFactory の有する機能以外に以下の機能を有します。メモリの使用量に厳しい制限がある場合を除き BeanFactory よりも ApplicationContext を使用することが推奨されています。

* i18n を考慮したメッセージへのアクセス
* URL やファイルのようなリソースへのアクセス
* ApplicationListener インタフェースを実装したビーンへのイベントの伝播
* 複数のコンテキストをロード可能

ApplicationContext の生成は BeanFactory の生成とほとんど変わりません。以下のようにします。

ApplicationContext appContext = new FileSystemXmlApplicationContext("beans.xml");

BeanFactory の場合と同様クラスパスから Bean 定義ファイルを取得することもできます。

ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");

また BeanFactory とは異なり ApplicationContext では Bean 設定ファイルを複数読み込むことができます。

String[] configs = {"beans-common.xml", "beans-user.xml"};
ApplicationContext context = new ClassPathXmlApplicationContext(configs);

プロジェクトが大きくなってくると、複数Bean設定ファイルに分けたほうがよさそうなんで、この機能は必要そう。
そんなに厳しいメモリ制限があるJavaプロジェクトもなさそうなんで、ほぼこれを使用しているんでしょう。

ためしにBean設定ファイルを分けて実行

編集したソース
・beans.xml(id=manをbeans2.xmlに移動)
・beans2.xml(新規作成)
・main.java いかのように変更

/**
 * SpringFrameworkTest 2008/07/07
 */
package jp.co.jjjjpppp.springtest.impl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String args) {

		String config = { "src/configerFiles/beans.xml",
				"src/configerFiles/beans2.xml" };
		
		ApplicationContext appCon = new FileSystemXmlApplicationContext(config);

		Man man = (Man) appCon.getBean("man");

		man.buyHouse();
	}
}

beanを使用するためのソースが少なくなっていい感じに。

以下実行結果

2008/07/25 11:30:31 org.springframework.context.support.AbstractApplicationContext prepareRefresh
情報: Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@1d6096: display name [org.springframework.context.support.FileSystemXmlApplicationContext@1d6096]; startup date [Fri Jul 25 11:30:31 JST 2008]; root of context hierarchy
2008/07/25 11:30:31 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
情報: Loading XML bean definitions from file [C:\eclipse\workSpace\SpringFrameworkTest\src\configerFiles\beans.xml]
六本木ヒルズを建築します。
★以下の会社に協力してもらいます。
習志野建設30人2000万
国土交通省4000人20兆円
★以下のステークスホルダーが存在します。
下請け
★以下の工法で建築します
骨組み重視
2008/07/25 11:30:31 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
情報: Loading XML bean definitions from file [C:\eclipse\workSpace\SpringFrameworkTest\src\configerFiles\beans2.xml]
2008/07/25 11:30:31 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
情報: Bean factory for application context [org.springframework.context.support.FileSystemXmlApplicationContext@1d6096]: org.springframework.beans.factory.support.DefaultListableBeanFactory@f0eed6
2008/07/25 11:30:31 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
情報: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@f0eed6: defining beans [CC1,CC2,oobayashi,man]; root of factory hierarchy

無事成功。しかし何も設定していないが、標準出力に赤色のログがうざい感じに。ログについては後の課題としよう。