web-dev-qa-db-ja.com

春の豆って何?

私が理解できるSpring Beanの高レベルの定義はまだ見つかっていません。私はそれらがGrailsの文書や本で頻繁に参照されているのを見ますが、それらを理解することは有益であると思います。それで、春の豆は何ですか?どうやって使えますか?彼らは依存注入と関係がありますか?

350

アプリケーションのバックボーンを形成し、Spring IoC *コンテナによって管理されるオブジェクトはBeanと呼ばれます。 Beanは、Spring IoCコンテナによってインスタンス化、アセンブル、およびその他の方法で管理されるオブジェクトです。これらのBeanは、XML定義の形式など、ユーザーがコンテナーに提供する構成メタデータを使用して作成されます。

Beanとスコープについての詳細は SpringSource を参照してください。

Bean定義を作成するときに実際に作成しているのは、そのBean定義によって定義されたクラスの実際のインスタンスを作成するためのレシピです。 Bean定義がレシピであるという考え方は重要です。なぜなら、それはクラスと同じように、単一のレシピから多数のオブジェクトインスタンスを作成できる可能性があるからです。

特定のBean定義から作成されたオブジェクトにプラグインされるさまざまな依存関係および構成値だけでなく、特定のBean定義から作成されたオブジェクトの有効範囲も制御できます。このアプローチは非常に強力であり、Javaクラスレベルでオブジェクトのスコープを「焼き込む」必要がなく、構成を通じて作成するオブジェクトのスコープを柔軟に選択できます。 Beanは、さまざまなスコープの1つにデプロイされるように定義できます。

* IoC:コントロールの逆転

186
Juned Ahsan

Spring Beansは、Springコンテナによって管理される単なるオブジェクトインスタンスです。つまり、それらはフレームワークによって作成され配線され、後で取得できる場所から「オブジェクトの袋」(コンテナ)に入れられます。

「配線」部分には、依存性注入がすべて関係しています。つまり、「これが必要です」と言うことができ、フレームワークは適切なインスタンスを取得するためにいくつかの規則に従います。

Springに慣れていない人のために、 Wikipedia Springの記事にはいい説明があります

Spring Frameworkの中心となるのは、コントロールコンテナの反転です。これは、リフレクションを使用してJavaオブジェクトを設定および管理するための一貫した手段を提供します。コンテナは、特定のオブジェクトのオブジェクトライフサイクルを管理します。これらのオブジェクトを作成し、それらの初期化メソッドを呼び出し、それらを相互に配線して設定します。

コンテナーによって作成されたオブジェクトは、 管理対象オブジェクト または beans とも呼ばれます。コンテナーは、XMLファイルをロードするか、構成クラス上の特定のJavaアノテーションを検出することによって構成できます。これらのデータソースには、Beanの作成に必要な情報を提供するBean定義が含まれています。

オブジェクトは依存関係検索または依存関係注入のいずれかの方法で取得できます。 Dependency lookupは、呼び出し側がコンテナオブジェクトに特定の名前または特定の種類のオブジェクトを要求するパターンです。 Dependency injectionは、コンストラクタ、プロパティ、ファクトリメソッドのいずれかを介して、コンテナがオブジェクトを名前で他のオブジェクトに渡すパターンです。

120
elias

まず、Springについて理解しましょう。

春は軽量で柔軟なフレームワークです。

アナロジー:
enter image description here

Bean: はSpring Containerで作成、管理、破棄されるオブジェクトです。メタデータ(xmlまたはアノテーション)を介してオブジェクトをSpring Containerに注入することができます。これは制御の反転と呼ばれます。

アナロジー: 農民が種子(または豆)で栽培している農地を持っていると仮定しましょう。ここで、農家は春の枠組み、農地は春のコンテナ、豆は春の豆、栽培は春の加工業者です。

enter image description here

豆のライフサイクルと同様に、春の豆もそれ自身のライフサイクルを持っています。

enter image description here

enter image description here

画像ソース

以下はSpringにおけるbeanのライフサイクルの流れです:

  • インスタンス化:最初にspringコンテナーはXMLファイルからBeanの定義を見つけ、そのBeanをインスタンス化します。

  • プロパティの生成:依存性注入を使用して、springはBean定義で指定されているすべてのプロパティを生成します。

  • Set Bean Name:BeanがBeanNameAwareインターフェースを実装している場合、springはBeanのIDをsetBeanName()メソッドに渡します。

  • Set Bean factory:BeanがBeanFactoryAwareインターフェースを実装している場合、springはBeanfactoryをsetBeanFactory()メソッドに渡します。

  • 初期化前:Beanの後処理とも呼ばれます。 Beanに関連付けられたBean BeanPostProcessorsがある場合、SpringはpostProcesserBeforeInitialization()メソッドを呼び出します。

  • Beanの初期化:BeanがIntializingBeanを実装している場合は、そのafterPropertySet()メソッドが呼び出されます。 Beanにinitメソッド宣言がある場合は、指定された初期化メソッドが呼び出されます。

  • 初期化後 - Beanに関連付けられているBeanPostProcessorsがある場合は、それらのpostProcessAfterInitialization()メソッドが呼び出されます。

  • すぐに使える:これで、Beanはアプリケーションで使用できるようになりました

  • 破棄:BeanがDisposableBeanを実装している場合は、destroy()メソッドを呼び出します。

29
Premraj

さてあなたはそれを部分的に理解しました。 Martin Fowler によって造られたIoC( Inversion of Control )として一般的に知られている方法論を使用することによって、必要に応じてBeanを管理し、必要に応じてそれを管理する 依存性注入 (DI)とも呼ばれます。

ある方法でBeanを配線するので、インスタンス化の面倒を見たり、Beanへの依存関係を評価したりする必要はありません。これは一般に Hollywood Principle として知られています。

この質問であなたがあふれるリンクに加えて、グーグルはこれについてもっと探求するための最良のツールです。 :)

21
dmahapatro

Springには、豆の袋を運ぶIoCコンテナがあります。作成の維持と削除はSpring Containerの責任です。 WiringとAuto Wiringを使えば、BeanをSpringに入れることができます。 Wiringとは手動でXMLファイルに設定することを意味し、 "Auto Wiring"とはアノテーションをJavaファイルに入れることでSpringが自動的にルートコンテキストをスキャンしてJava設定ファイルを作成し、Springの袋に入れるという意味です。

これはBeansについてもっと詳しい情報を得た詳細なURIです

  • Spring Beanは、Spring IOCコンテナによって管理される単なるオブジェクトインスタンスです。

  • Spring IOC containerは、Bag of Beanを運びます。Beanの作成、管理、および削除は、Spring Containerの責任です。

  • WiringとAuto Wiringを使えば、BeanをSpringに入れることができます。

  • 配線とは、手動でXMLファイルに構成するということです。

  • Auto Wiringとは、アノテーションをJavaファイルに入れてから、Springが自動的にJavaコンテキスト設定ファイルのあるルートコンテキストをスキャンして作成し、Springの袋に入れることを意味します。

5
maniBrock

春の豆はクラスです。 (newを使用して)クラスをインスタンス化する代わりに、アプリケーションコンテキストからクラスタイプへのbeanキャストとしてインスタンスを取得します。ここで、Beanはアプリケーションコンテキスト設定で設定したものです。このようにして、アプリケーション全体がアプリケーション全体にわたってシングルトンスコープのインスタンスを維持します。アプリケーションコンテキストがインスタンス化された直後に、すべてのBeanは設定順に従って初期化されます。アプリケーションにBeanがない場合でも、アプリケーションコンテキストを作成した直後にすべてのBeanインスタンスがすでに作成されています。

4
Downhillski

Springでは、アプリケーションのバックボーンを形成し、SpringのIoCコンテナによって管理されるオブジェクトはBeanと呼ばれます。 Beanは、Spring IoCコンテナによってインスタンス化され、組み立てられ、その他の方法で管理される単なるオブジェクトです。

2
user3472473

Springの場合、すべてのオブジェクトはBeanです。 Spring Frameworkの基本的なステップは、オブジェクトをBeanとして定義することです。 Beanは、それらのクラス定義を見ることによってSpringフレームワークによって作成されるオブジェクトインスタンスに他なりません。これらの定義は基本的に設定メタデータを形成します。次にフレームワークは、この構成メタデータに基づいて、どのオブジェクトをインスタンス化する必要があるか、どの依存関係を設定および注入する必要があるか、新しく作成されたインスタンスのスコープなどについて計画を作成します。

最初の章と同じように、メタデータは単純なXMLファイルで提供できます。あるいは、AnnotationまたはJava Configurationとしてメタデータを提供することもできます。

本: ジャストスプリング

SpringのXML構成はBeansで構成されており、Beansは基本的にクラスです。それらは、私たちがApplicationContextの中で使用する単なるPOJOです。 Beanを定義することは、キーワードnewを置き換えることと考えることができます。そのため、アプリケーションでnewキーワードを使用している場所はどこでも、

MyRepository myRepository =new MyRepository ();

あなたがそのキーワードを使っているところ new それはどこかにあなたがその設定を削除してXMLファイルにそれを置くことを見ることができるところです。だから我々はこのようにコーディングします:

<bean name="myRepository " 
      class="com.demo.repository.MyRepository " />

これで、単にSetter Injection/Constructor Injectionを使うことができます。私はセッターインジェクションを使用しています。

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}
0
Wiqi