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部分コード:
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);
  • 第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部分コード:
    if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
        beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
        beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    }
  • この部分は、loadTimeWeaverというbeanが定義されているかどうかを判断し、定義されているならば、loadTimeWeaver機能を追加するbeanPostProcessor拡張を行い、その真のbeanを処理するために臨時のclassLoaderを作成する。springのloadTimeWeaverは主にinstructionの動的バイトコードによって積載期間における注入依存性を強化する。具体的にはこの部分はまだよく理解していませんので、一応マークしてから専門的に検討してみます。
  • 第3部分コード:
    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);
    }
  • は上の部分と似ていますが、システム属性からシステム環境変数に変更され、異常処理方式なども上の部分と同じです。この二つの部分はspring内部にシステム情報を提供するサポートbeanである。
  •  
    二、prepareBenFactory()メソッド呼び出し後、try-catchコードブロックであり、BeanException異常が発生するとrefshを停止して作成したリソースを廃棄します。コードブロックの最初の行のpostProcessBenFactoryを見ます。
    postProcesssBenFactory()メソッドは、デフォルトのメソッド体は空で、主にbeanfactoryを拡張するために使用されます。拡張点はbeanなどの配置が既にロードされていますが、まだ実用化されていない場合です。
    例えば上記のaware関連インターフェースは自動的に組み立てられています。webプロジェクトであれば、springのwebApplication contextを使っています。この場合はいくつかのServletContaware関連の自動組立の見落としや配置などが必要です。