259

私はSpringFrameworkにかなり慣れていないので、Spring MVCを評価して次の会社のプロジェクトで使用するために、Spring Frameworkをいじって、いくつかのサンプルアプリをまとめています。これまでのところ、Spring MVCで見たものが本当に気に入っており、非常に使いやすいようで、単体テストに非常に適したクラスを作成することをお勧めします。

演習と同じように、サンプル/テストプロジェクトの1つのメインメソッドを作成しています。私がよくわからないことの1つは、との正確な違いBeanFactoryですApplicationContext。これは、どの条件で使用するのが適切ですか。

ApplicationContextそれが拡張されることは理解していますBeanFactoryが、単純なmainメソッドを記述しているだけの場合、ApplicationContext提供する追加の機能が必要ですか?そして、まさにどのような追加機能がApplicationContext提供するのでしょうか?

「main()メソッドでどちらを使用する必要があるか」という回答に加えて、そのようなシナリオでどの実装を使用する必要があるかについての標準またはガイドラインはありますか?私のmain()メソッドは、XML形式のBean /アプリケーション構成に依存するように作成する必要があります-それは安全な仮定ですか、それともユーザーを特定の何かにロックしていますか?

そして、この答えはWeb環境で変化しますか?私のクラスのいずれかがSpringを認識する必要がある場合、それらは必要になる可能性が高くなりますApplicationContextか?

助けてくれてありがとう。これらの質問の多くはおそらくリファレンスマニュアルで回答されていることは知っていますが、細かい櫛でマニュアルを読まずに、これら2つのインターフェイスとそれぞれの長所/短所の明確な内訳を見つけるのに苦労しています。

4

21 に答える 21

224

春のドキュメントはこれで素晴らしいです: 3.8.1. BeanFactory または ApplicationContext? . 比較表があります。スニペットを投稿します。

ビーンファクトリー

  • Bean のインスタンス化/配線

アプリケーションのコンテキスト

  • Bean のインスタンス化/配線
  • BeanPostProcessor の自動登録
  • BeanFactoryPostProcessor の自動登録
  • 便利な MessageSource アクセス (i18n 用)
  • ApplicationEvent パブリケーション

したがって、Application Context 側で提示されたポイントのいずれかが必要な場合は、ApplicationContext を使用する必要があります。

于 2008-10-28T14:04:37.687 に答える
50

私にとって、選択すべき主な違いは、すべての BeanBeanFactoryを事前にインスタンス化することです。ドキュメントから:ApplicationContextApplicationContext

Spring は、Bean が実際に作成されたときに、できるだけ遅くプロパティを設定し、依存関係を解決します。つまり、正しくロードされた Spring コンテナーは、オブジェクトまたはその依存関係の作成に問題がある場合、オブジェクトを要求したときに後で例外を生成できます。たとえば、プロパティが見つからないか無効な場合、Bean は例外をスローします。このように一部の構成問題の可視性が遅れる可能性があるのは、デフォルトで ApplicationContext 実装がシングルトン Bean を事前にインスタンス化する理由です。これらの Bean を実際に必要になる前に作成するための事前の時間とメモリを犠牲にして、後でではなく、ApplicationContext が作成されたときに構成の問題を発見します。シングルトン Bean が事前にインスタンス化されるのではなく、遅延初期化されるように、このデフォルトの動作をオーバーライドすることもできます。

これを考慮して、BeanFactory分離された Bean をテストするためにアプリケーション全体をロードしたくなかったので、最初は統合/パフォーマンス テストで使用することを選択しました。ただし、間違っている場合は訂正してください。XML 構成BeanFactoryはサポートされていません。classpathしたがってBeanFactoryApplicationContextそれぞれが私が望んでいた重要な機能を提供しますが、両方も提供しませんでした。

私が知る限り、デフォルトのインスタンス化動作のオーバーライドに関するドキュメントのメモは構成で行われ、それは Bean ごとであるため、XML ファイルに「lazy-init」属性を設定することはできません。テスト用と展開用のバージョンを維持するのに行き詰まりました。

私がやったのはClassPathXmlApplicationContext、次のようなテストで使用するためにBeanを遅延ロードするように拡張することでした:

public class LazyLoadingXmlApplicationContext extends ClassPathXmlApplicationContext {

    public LazyLoadingXmlApplicationContext(String[] configLocations) {
        super(configLocations);
    }

    /**
     * Upon loading bean definitions, force beans to be lazy-initialized.
     * @see org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.xml.XmlBeanDefinitionReader)
     */

    @Override
    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
        super.loadBeanDefinitions(reader);
        for (String name: reader.getBeanFactory().getBeanDefinitionNames()) {
            AbstractBeanDefinition beanDefinition = (AbstractBeanDefinition) reader.getBeanFactory().getBeanDefinition(name);
            beanDefinition.setLazyInit(true);
        }
    }

}
于 2010-02-28T03:04:00.640 に答える
33

Miguel Pingが回答した内容に追加するために、これにも回答するドキュメントの別のセクションを次に示します。

短いバージョン:そうしない本当に正当な理由がない限り、ApplicationContextを使用してください。上記の推奨事項の「しかしなぜ」についてもう少し詳しく知りたい方は、読み続けてください。

(この質問を読む可能性のある将来の春の初心者のためにこれを投稿してください)

于 2008-10-28T14:08:23.997 に答える
20
  1. ApplicationContextよりも好ましい方法ですBeanFactory

  2. 新しい Spring バージョンBeanFactoryでは、 に置き換えられApplicationContextます。しかしBeanFactory、下位互換性のためにまだ存在しています

  3. ApplicationContext extends BeanFactoryそして以下のメリットがあります
    • テキストメッセージの国際化をサポートしています
    • 登録されたリスナーへのイベント発行をサポートします
    • URL やファイルなどのリソースへのアクセス
于 2010-02-27T12:04:16.480 に答える
14

ApplicationContext: Spring 構成ファイルで構成された Spring Bean をロードし、Spring Bean のライフサイクルを WHEN CONTAINER STARTS として管理します。getBean("springbeanref")が呼び出されるまで待機しません。

BeanFactory Spring 設定ファイルに設定された Spring Bean をロードし、getBean("springbeanref")を呼び出すと、Spring Bean のライフサイクルを管理します。 .

于 2013-06-04T07:15:46.687 に答える
13

他の誰かがすでに言ったようにモバイル環境にいる場合を除き、常に ApplicationContext を使用する方が良いと思います。ApplicationContext にはよ​​り多くの機能があり、Spring 構成ファイルを簡素化するのに役立つ RequiredAnnotationBeanPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor などの PostProcessors を確実に使用する必要があり、Bean で @Required、@PostConstruct、@Resource などの注釈を使用できます。 .

ApplicationContext が提供するすべてのものを使用しない場合でも、とにかくそれを使用することをお勧めします。その後、メッセージやポスト プロセッサなどのリソースや、トランザクションのアドバイスなどを追加する他のスキーマを使用することにした場合は、既に ApplicationContext があり、コードを変更する必要はありません。

スタンドアロン アプリを作成している場合は、ClassPathXmlApplicationContext を使用してメイン メソッドに ApplicationContext を読み込み、メイン Bean を取得してその run() (または任意のメソッド) を呼び出してアプリを起動します。Web アプリを作成している場合は、web.xml で ContextLoaderListener を使用して ApplicationContext を作成し、後で ServletContext から取得できるようにします。これは、JSP、JSF、JSTL、struts、Tapestry などを使用しているかどうかに関係ありません。 .

また、複数の Spring 構成ファイルを使用でき、コンストラクターですべてのファイルをリストする (または ContextLoaderListener の context-param でそれらをリストする) ことによって ApplicationContext を作成するか、単にメインの構成ファイルをロードすることができることを覚えておいてください。ステートメントをインポートします。<import resource="otherfile.xml" /> を使用して、Spring 構成ファイルを別の Spring 構成ファイルにインポートできます。これは、main メソッドでプログラムによって ApplicationContext を作成し、Spring 構成ファイルを 1 つだけロードする場合に非常に便利です。

于 2008-11-04T18:39:56.563 に答える
6

ほとんどの場合、モバイル アプリケーションのようにリソースを節約する必要がない限り、ApplicationContext が優先されます。

XML 形式に依存するかどうかはわかりませんが、ApplicationContext の最も一般的な実装は、ClassPathXmlApplicationContext、XmlWebApplicationContext、FileSystemXmlApplicationContext などの XML であると確信しています。使ったことがあるのはこの3つだけです。

Web アプリを開発している場合は、XmlWebApplicationContext を使用する必要があると言っても過言ではありません。

Bean に Spring を認識させたい場合は、そのために BeanFactoryAware および/または ApplicationContextAware を実装させることができるため、BeanFactory または ApplicationContext のいずれかを使用して、実装するインターフェースを選択できます。

于 2008-10-28T21:02:39.840 に答える
6

基本的に、Spring Container オブジェクトは 2 つの方法で作成できます。

  1. BeanFactory を使用します。
  2. ApplicationContext を使用します。

どちらもインターフェースであり、

実装クラスを使用して、Spring コンテナーのオブジェクトを作成できます

違いに来る

BeanFactory :

  1. 注釈ベースの依存性注入をサポートしていません。

  2. I18N には対応していません。

  3. デフォルトでは、遅延読み込みがサポートされています。

  4. 複数の構成ファイルに構成することはできません。

例: BeanFactory context=new XmlBeanFactory(new Resource("applicationContext.xml"));

アプリケーションコンテキスト

  1. 注釈ベースの依存性注入をサポートします。-@Autowired、@PreDestroy

  2. 国際化対応

  3. そのデフォルトでは、積極的な読み込みをサポートしています。

  4. 複数の構成ファイルを構成できます。

例:
ApplicationContext context=new ClasspathXmlApplicationContext("applicationContext.xml");

于 2016-01-18T05:59:53.177 に答える
5

BeanFactoryApplicationContextはどちらも、Spring IOCコンテナーから Bean を取得する方法ですが、それでもいくつかの違いがあります。

BeanFactoryは、多数の Bean をインスタンス化、構成、および管理する実際のコンテナーです。これらの Bean は通常、相互に連携するため、相互に依存関係があります。これらの依存関係は、BeanFactory によって使用される構成データに反映されます。

BeanFactoryApplicationContextはどちらも Java インターフェースであり、ApplicationContext は BeanFactory を拡張します。どちらも XML 構成ファイルを使用した構成です。つまり、BeanFactory は基本的な制御の反転 ( IoC ) と依存性注入 ( DI ) 機能を提供し、ApplicationContext は高度な機能を提供します。

BeanFactory は、インターフェース「 org.springframework.beans.factory 」Where BeanFactoryによって表され、複数の実装があります。

ClassPathResource resource = new ClassPathResource("appConfig.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);

違い

  1. BeanFactoryはgetBean()メソッドを呼び出したときに Bean をインスタンス化し、 ApplicationContext はコンテナーの起動時にシングルトン Bean をインスタンス化します。 getBean() が呼び出されるのを待ちません。

  2. BeanFactoryは国際化をサポートしていませんが、ApplicationContextは国際化をサポートしています。

  3. BeanFactoryApplicationContextのもう 1 つの違いは、リスナーとして登録されている Bean にイベントを発行できることです。

  4. BeanFactoryインターフェースの一般的な実装の1 つはXMLBeanFactoryであり、 ApplicationContextインターフェースの一般的な実装の 1 つはClassPathXmlApplicationContextです。

  5. 自動配線を使用してBeanFactoryを使用している場合は、 ApplicationContextを使用している場合に XML で構成できる API を使用して AutoWiredBeanPostProcessorを登録する必要があります。要約すると、 BeanFactoryはテストおよび非本番使用には問題ありませんが、ApplicationContextはより機能豊富なコンテナー実装であり、BeanFactoryよりも優先する必要があります

  6. BeanFactoryはデフォルトで遅延読み込みをサポートApplicationContextはデフォルトで積極的な読み込みをサポートします。

于 2016-01-15T05:32:19.863 に答える
1

ApplicationContext は BeanFactory の兄弟であり、これは BeanFactory が提供するすべてのものに加えて、他の多くのものになります。

標準の org.springframework.beans.factory.BeanFactory ライフサイクル機能に加えて、ApplicationContext 実装は ApplicationContextAware Bean と ResourceLoaderAware、ApplicationEventPublisherAware、および MessageSourceAware Bean を検出して呼び出します。

于 2015-02-26T06:52:30.917 に答える
1

Spring Docs からこのドキュメントを参照してください。

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-introduction-ctx-vs-beanfactory

5.15.1 BeanFactory または ApplicationContext?

正当な理由がない限り、ApplicationContext を使用してください。

ApplicationContext には BeanFactory のすべての機能が含まれているため、通常は BeanFactory よりも推奨されます。ただし、ほとんどの典型的なエンタープライズ アプリケーションおよびシステムでは、ApplicationContext を使用する必要があります。Spring 2.0 以降では、BeanPostProcessor 拡張ポイントを頻繁に使用します (プロキシなどを実行するため)。プレーンな BeanFactory のみを使用する場合、トランザクションや AOP などのかなりの量のサポートは有効になりません。少なくとも、追加の手順が必要です。実際には構成に問題がないため、この状況は混乱を招く可能性があります。

于 2013-04-27T16:58:43.900 に答える