春の豆は一体何ですか?


397

理解できるSpring Beanの高レベルの定義はまだ見つけていません。それらはGrailsのドキュメントや本で頻繁に参照されていますが、それらが何であるかを理解することは有益だと思います。では、春の豆とは何でしょうか?それらはどのように使用できますか?彼らは依存性注入と関係がありますか?


2
GrailsはSpring上に構築されています。Springに慣れていない場合は、少なくともいくつかの資料を読んで、使用しているテクノロジーを理解することをお勧めします。
Jeff Storey 2013年

26
ここでのコメントは、OPがGrailsのドキュメントや書籍のリファレンスで見ているのと同じ問題に悩まされていると思います。ウィキペディアの記事は、初心者にとってはるかによく説明していることがわかりました。
エリアスドルネレス2013年

12
@MarcoForbergが、Springの古いバージョンがGoogleで人気を博している理由の1つは、人々がSOなどの場所からリンクし続けているためです... static.springsource.org/spring/docs/3.2.x/…のほうが良いでしょう。 これらの日を開始する場所。
Ian Roberts

5
+1 @IanRoberts。こちらが現在のものです。
dmahapatro 2013年

IoCはDIとしても知られていると言って、彼らがIoCを導入するのを助けません。それらは関連していますが、IoCははるかに広範です。
Aluan Haddad、2016

回答:


212

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

SpringSourceからBeanとスコープについてさらに学ぶには:

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

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

* IoC:制御の反転


10
したがって、これらはコンテナが管理するオブジェクトであり、操作する必要はありませんが、Beanにアクセスしていくつかのメソッドを呼び出したり、プロパティを取得したりする場合は、SpringにBeanを「要求」できますか?
grantmcconnaughey 2013年

22
@grantmcそれはそのようなものですが、制御の反転は「尋ねる」の反対として理解されることになっています:物事を「尋ねる」のではなく、それが必要であることを「宣言」します。そして、アプリを起動すると、フレームワークはすべての宣言をチェックし、適切なインスタンスを設定します。
エリアスドルネレス2013年

6
@eliasどうすれば必要だと宣言できますか?使ってる時です@Autowiredか?または単に私が私importのs をするとき?
Mikhail Batcer、2015

16
Springの初心者にとってIoCが何を意味するかを定義しておくと役に立ちます。
ルーカス

4
@lucas同意した。IoCは「制御の反転」です。優れたQ&Aをご覧ください:Spring Frameworkの依存性注入と制御の反転とは何ですか?制御の反転とは何ですか?
mhradek 2017

135

Spring Beanは、Springコンテナによって管理される単なるインスタンスオブジェクトです。つまり、フレームワークによって作成およびワイヤリングされ、後で取得できる「オブジェクトのバッグ」(コンテナ)に配置されます。

そこにある「配線」の部分とは、依存性注入のすべてのことです。つまり、「私はこれが必要です」と言うだけで、フレームワークはいくつかのルールに従って適切なインスタンスを取得します。

Springに慣れていない人にとっては、WikipediaのSpringの記事に適切な説明があると思います。

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

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

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


インスタンスはオブジェクトの単なる別の言葉です。「オブジェクトインスタンス」を使用するとき、オブジェクトオブジェクトと言っていませんか?
ウドゥンの炎

興味深い質問です。ウィキペディアによると、代わりに「インスタンスオブジェクト」と言う必要があります:en.wikipedia.org/wiki/Instance_(
computer_science

2
ウサギの穴が深くなります。
ウドゥンの炎

「オブジェクトオブジェクト」(したがってオブジェクトインスタンス)は、クラスもオブジェクトである言語に慣れている(つまり、クラスオブジェクトと「オブジェクト」オブジェクトがある) )。とにかく、Wikipediaの記事に従って「インスタンスオブジェクト」を使用するように説明を更新しました。^^
エリアスドルネレス

1
@Ruizhiは通常のオブジェクト、つまりクラスのインスタンスです-この議論は、正しい式を使用してオブジェクトを参照することに関する副次的なものでした。:)
エリアスドルネレス

50

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

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

類推:
ここに画像の説明を入力してください

Bean: Spring Containerで作成、管理、破棄されるオブジェクトです。コントロールの反転と呼ばれるメタデータ(xmlまたは注釈)を介してオブジェクトをSpringコンテナーに挿入できます。

類推: 農家が種子(または豆)で耕作している農地を持っていると仮定しましょう。ここで、農家はSpring Framework、農地はSpring Container、豆はSpring Beans、栽培はSpring Processorsです。

ここに画像の説明を入力してください

豆のライフサイクルと同様に、春の豆にも独自のライフサイクルがあります。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

imgソース

以下は、SpringでのBeanライフサイクルのシーケンスです。

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

  • プロパティの設定:依存関係の注入を使用して、SpringはBean定義で指定されたすべてのプロパティを設定します。

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

  • Beanファクトリーの設定:BeanがBeanFactoryAwareインターフェースを実装している場合、SpringはbeanfactoryをsetBeanFactory()メソッドに渡します。

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

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

  • 初期化後:– BeanPostProcessorsBeanに関連付けられているものがあれば、それらのpostProcessAfterInitialization()メソッドが呼び出されます。

  • 使用準備完了:これで、アプリケーションでBeanを使用する準備ができました

  • Destroy:Beanがを実装している場合はDisposableBeandestroy()メソッドを呼び出します


23

さてあなたはそれを部分的に理解しました。必要に応じてBeanを調整し、必要に応じてそれを管理するようにSpringコンテナに通知する必要があります。これは、Martin Fowlerが作成したIoC(Inversion of Control)と呼ばれる方法論を使用して、Dependency Injection(DI)とも呼ばれます。

ある方法でBeanをワイヤリングするため、Beanへの依存をインスタンス化したり、依存関係を評価したりする必要はありません。これは一般にハリウッド原則として知られています。

Googleは、この質問でここに殺到するリンクに加えて、これについてさらに詳しく調べるのに最適なツールです。:)


2
IoCが概念であり、DIがIoCを達成するために使用できる手法(の1つ)であることを指摘することはできません。これらは置き換え可能な定義ではありません。
kekko12

9

Springには、Bag of Beanを運ぶIoCコンテナがあります。作成の維持と削除はSpring Containerの責任です。配線と自動配線により、春に豆を入れることができます。配線とは、XMLファイルに手動で構成することを意味し、「自動配線」とは、Javaファイルに注釈を配置してから、Java構成ファイルのルートコンテキストをSpringが自動的にスキャンして作成し、Springのバッグに入れることを意味します。

Beanに関する詳細情報を取得した詳細なURIは次のとおりです


8

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


1
Beanはクラスではなく、クラスのインスタンスとしてのオブジェクトであり、コンテナ実装によって管理されます。
Chatatata

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

  • Spring IOCコンテナにはBag of Beanが含まれています。Beanの作成、維持、削除は、Spring Containerの役割です。

  • 配線と自動配線により、春に豆を入れることができます。

  • 配線とは、XMLファイルに手動で構成することを意味します。

  • 自動配線とは、Javaファイルに注釈を入れてから、SpringがルートコンテキストのJava構成ファイルを自動的にスキャンして作成し、Springのバッグに入れることを意味します。


7

BeanはPOJO(Plain Old Java Object)であり、Springコンテナによって管理されます。

Springコンテナーは、デフォルトでBeanのインスタンスを1つだけ作成します。このBeanはメモリにキャッシュされるため、Beanに対するすべての要求は同じBeanへの共有参照を返します。

@Beanアノテーションは、アプリケーションコンテキストでBeanとしてスプリング登録されるオブジェクトを返します。メソッド内のロジックは、インスタンスの作成を担当します。

@Beanアノテーションはいつ使用しますか?

自動構成がオプションではない場合。たとえば、サードパーティのライブラリからコンポーネントをワイヤリングする場合は、ソースコードが利用できないため、@ Componentでクラスに注釈を付けることができません。

リアルタイムのシナリオでは、誰かがAmazon S3バケットに接続したい場合があります。ソースが利用できないため、@ beanを作成する必要があります。

@Bean
public AmazonS3 awsS3Client() {
    BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
    return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}

上記のコードのソース-> https://www.devglan.com/spring-mvc/aws-s3-java

上記の@Componentアノテーションについて述べたからです。

@Component注釈付きクラスが「コンポーネント」であることを示します。このようなクラスは、注釈ベースの構成とクラスパススキャンを使用する場合、自動検出の候補と見なされます。

コンポーネントアノテーションは、クラスを単一のBeanとして登録します。


2

Springでは、アプリケーションのバックボーンを形成し、Spring IoCコンテナーによって管理されるオブジェクトをBeanと呼びます。Beanは単に、Spring IoCコンテナによってインスタンス化、アセンブル、および管理されるオブジェクトです。


1

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

メタデータは、最初の章と同様に、単純なXMLファイルで提供できます。あるいは、メタデータを注釈またはJava構成として提供することもできます。

ブック:Just Spring


1

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

MyRepository myRepository =new MyRepository ();

キーワードnewをどこで使用しているかは、その構成を削除してXMLファイルに配置することで確認できます。したがって、次のようにコーディングします。

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

これで、セッターインジェクション/コンストラクターインジェクションを使用できます。私はセッター注射を使用しています。

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.