springソース学習ノート-初期化(三)-BeanFactory
5429 ワード
自動回転http://www.sandzhang.com/blog/2011/04/05/spring-study-notes-initialization-3/
refresh()の方法では上編のオーブタインFreeshBenFactory()の方法でbeanfactoryオブジェクトを作成しました。その後のコードはbeanFactoryオブジェクトのいくつかの処理に始まります。BenFactoryに関するいくつかの内容もspringの核心内容です。
注:refresh()のコードは再度列挙しません。springのソースコードの中でAbstractAplicationControtext類を見てください。
一、まずprepareBenFactoryです。主にいくつかのbeanFactoryの初期化をしました。この方法は長いので、4つの部分に分けて見ます。
第1部分コード:第1行にbeanFactoryを設置するクラスリーダーは、現在のcontextのクラスリーダー である。行目にbeanFactoryの表現言語プロセッサを設定し、spring 3には表現言語のサポートが追加され、デフォルトでは関連する属性値が呼ばれる。 第3行為のbeanFactoryはデフォルトのpropertyEditorを追加しました。これは主にbeanの属性などの設定管理のツールです。後で詳しく分析します。 第4行はaware関連インターフェースを処理するbeanPostProcessor拡張を追加しました。主にbeanPostProcessorを使用するpostProcess Before Initialization()前置処理方法でaware関連インターフェースを実現する機能を追加しました。awareインターフェースはBeanにいくつかのリソースを注入するインターフェースです。Spring容器はBeanFactoryに注入されます。その例としてApple ControtextAware、Resource Loader Aware、Servlet Contact Awareなどがあります。 第5-8行には自動組立を無視するインターフェースがいくつか設置されていますが、デフォルトはBeanFactoryAwareだけです。他は自分で設定します。ここにはResorceLoader Aware、Appliation EventPublisher Aware、Message SourceAware、Application ContAwareが設置されています。 第9-12行にはいくつかの自動組立の特殊ルールが設けられています。BeanFactoryタイプであれば、beanFactoryオブジェクトを注入します。Resource Loader、Appplication Event Publisher、Appplication Contextタイプであれば、現在のオブジェクトを注入します。 第2部分コード:この部分は、loadTimeWeaverというbeanが定義されているかどうかを判断し、定義されているならば、loadTimeWeaver機能を追加するbeanPostProcessor拡張を行い、その真のbeanを処理するために臨時のclassLoaderを作成する。springのloadTimeWeaverは主にinstructionの動的バイトコードによって積載期間における注入依存性を強化する。具体的にはこの部分はまだよく理解していませんので、一応マークしてから専門的に検討してみます。 第3部分コード:
第4部分コード:は上の部分と似ていますが、システム属性からシステム環境変数に変更され、異常処理方式なども上の部分と同じです。この二つの部分はspring内部にシステム情報を提供するサポートbeanである。
二、prepareBenFactory()メソッド呼び出し後、try-catchコードブロックであり、BeanException異常が発生するとrefshを停止して作成したリソースを廃棄します。コードブロックの最初の行のpostProcessBenFactoryを見ます。
postProcesssBenFactory()メソッドは、デフォルトのメソッド体は空で、主にbeanfactoryを拡張するために使用されます。拡張点はbeanなどの配置が既にロードされていますが、まだ実用化されていない場合です。
例えば上記のaware関連インターフェースは自動的に組み立てられています。webプロジェクトであれば、springのwebApplication contextを使っています。この場合はいくつかのServletContaware関連の自動組立の見落としや配置などが必要です。
refresh()の方法では上編のオーブタインFreeshBenFactory()の方法でbeanfactoryオブジェクトを作成しました。その後のコードはbeanFactoryオブジェクトのいくつかの処理に始まります。BenFactoryに関するいくつかの内容もspringの核心内容です。
注:refresh()のコードは再度列挙しません。springのソースコードの中でAbstractAplicationControtext類を見てください。
一、まずprepareBenFactoryです。主にいくつかのbeanFactoryの初期化をしました。この方法は長いので、4つの部分に分けて見ます。
第1部分コード:
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver());
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this));
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
if (!beanFactory.containsBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
Map systemProperties;
try {
systemProperties = System.getProperties();
} catch (AccessControlException ex) {
systemProperties = new ReadOnlySystemAttributesMap() {
protected String getSystemAttribute(String propertyName) {
try {
return System.getProperty(propertyName);
} catch (AccessControlException ex) {
if (logger.isInfoEnabled()) {
logger.info("Not allowed to obtain system property [" + propertyName + "]: " +
ex.getMessage());
}
return null;
}
}
};
}
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, systemProperties);
}
この部分はまず、system Propertiesというbeanが定義されているかどうかを判断し、なければ、ローディングシステムは現在のシステム属性System.get Properties()を取得して、単一の例beanとして登録する。Access Control Exception権限が異常があればReadOnlySystem Attributes Mapオブジェクトを作成します。作成時にget SystemAttributeを書き換えた方法が見られます。ReadOnlySystem Attributes Mapのコードを調べて、getメソッドを呼び出した時にこの方法を呼び出してkey対応の対象を取得します。まだ権限があるAccess Control Exceptionを取得するとnullに戻ります。第4部分コード:
if (!beanFactory.containsBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
Map systemEnvironment;
try {
systemEnvironment = System.getenv();
} catch (AccessControlException ex) {
systemEnvironment = new ReadOnlySystemAttributesMap() {
protected String getSystemAttribute(String variableName) {
try {
return System.getenv(variableName);
} catch (AccessControlException ex) {
if (logger.isInfoEnabled()) {
logger.info("Not allowed to obtain system environment variable [" + variableName + "]: " +
ex.getMessage());
}
return null;
}
}
};
}
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, systemEnvironment);
}
二、prepareBenFactory()メソッド呼び出し後、try-catchコードブロックであり、BeanException異常が発生するとrefshを停止して作成したリソースを廃棄します。コードブロックの最初の行のpostProcessBenFactoryを見ます。
postProcesssBenFactory()メソッドは、デフォルトのメソッド体は空で、主にbeanfactoryを拡張するために使用されます。拡張点はbeanなどの配置が既にロードされていますが、まだ実用化されていない場合です。
例えば上記のaware関連インターフェースは自動的に組み立てられています。webプロジェクトであれば、springのwebApplication contextを使っています。この場合はいくつかのServletContaware関連の自動組立の見落としや配置などが必要です。