理解できるSpring Beanの高レベルの定義はまだ見つけていません。それらはGrailsのドキュメントや本で頻繁に参照されていますが、それらが何であるかを理解することは有益だと思います。では、春の豆とは何でしょうか?それらはどのように使用できますか?彼らは依存性注入と関係がありますか?
理解できるSpring Beanの高レベルの定義はまだ見つけていません。それらはGrailsのドキュメントや本で頻繁に参照されていますが、それらが何であるかを理解することは有益だと思います。では、春の豆とは何でしょうか?それらはどのように使用できますか?彼らは依存性注入と関係がありますか?
回答:
アプリケーションのバックボーンを形成し、Spring IoC *コンテナーによって管理されるオブジェクトは、Beanと呼ばれます。Beanは、インスタンス化、アセンブル、およびその他の方法でSpring IoCコンテナによって管理されるオブジェクトです。これらのBeanは、例えばXML
<bean/>
定義の形式でコンテナーに提供する構成メタデータを使用して作成されます。
SpringSourceからBeanとスコープについてさらに学ぶには:
Bean定義を作成すると、実際に作成するのは、そのBean定義で定義されたクラスの実際のインスタンスを作成するためのレシピです。Bean定義がレシピであるという考えは重要です。これは、クラスと同じように、単一のレシピから多くのオブジェクトインスタンスを作成できる可能性があることを意味するためです。
特定のBean定義から作成されたオブジェクトにプラグインされるさまざまな依存関係と構成値だけでなく、特定のBean定義から作成されたオブジェクトのスコープも制御できます。このアプローチは非常に強力で、Javaクラスレベルでオブジェクトのスコープを「焼き付ける」必要がなく、構成を通じて作成するオブジェクトのスコープを柔軟に選択できます。Beanは、多数のスコープの1つにデプロイされるように定義できます
* IoC:制御の反転
@Autowired
か?または単に私が私import
のs をするとき?
Spring Beanは、Springコンテナによって管理される単なるインスタンスオブジェクトです。つまり、フレームワークによって作成およびワイヤリングされ、後で取得できる「オブジェクトのバッグ」(コンテナ)に配置されます。
そこにある「配線」の部分とは、依存性注入のすべてのことです。つまり、「私はこれが必要です」と言うだけで、フレームワークはいくつかのルールに従って適切なインスタンスを取得します。
Springに慣れていない人にとっては、WikipediaのSpringの記事に適切な説明があると思います。
Spring Frameworkの中心は、リフレクションを使用してJavaオブジェクトを構成および管理する一貫した手段を提供するコントロールコンテナーの反転です。コンテナは、特定のオブジェクトのオブジェクトライフサイクルの管理を担当します。これらのオブジェクトを作成し、それらの初期化メソッドを呼び出し、それらを一緒に配線することによってこれらのオブジェクトを構成します。
コンテナによって作成されたオブジェクトは、管理対象オブジェクトまたは Beanとも呼ばれます。コンテナーは、XMLファイルをロードするか、構成クラスの特定のJavaアノテーションを検出することによって構成できます。これらのデータソースには、Beanの作成に必要な情報を提供するBean定義が含まれています。
オブジェクトは、依存関係のルックアップまたは 依存関係の注入のいずれかによって取得できます。依存関係のルックアップは、呼び出し元がコンテナオブジェクトに特定の名前または特定のタイプのオブジェクトを要求するパターンです。依存関係の注入は、コンストラクター、プロパティ、またはファクトリメソッドのいずれかを介して、コンテナーがオブジェクトを名前で他のオブジェクトに渡すパターンです。
まず、Springについて理解しましょう。
Springは軽量で柔軟なフレームワークです。
Bean: Spring Containerで作成、管理、破棄されるオブジェクトです。コントロールの反転と呼ばれるメタデータ(xmlまたは注釈)を介してオブジェクトをSpringコンテナーに挿入できます。
類推: 農家が種子(または豆)で耕作している農地を持っていると仮定しましょう。ここで、農家はSpring Framework、農地はSpring Container、豆はSpring Beans、栽培はSpring Processorsです。
豆のライフサイクルと同様に、春の豆にも独自のライフサイクルがあります。
以下は、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メソッド宣言がある場合、指定された初期化メソッドが呼び出されます。
初期化後:– BeanPostProcessors
Beanに関連付けられているものがあれば、それらのpostProcessAfterInitialization()
メソッドが呼び出されます。
使用準備完了:これで、アプリケーションでBeanを使用する準備ができました
Destroy:Beanがを実装している場合はDisposableBean
、destroy()
メソッドを呼び出します
さてあなたはそれを部分的に理解しました。必要に応じてBeanを調整し、必要に応じてそれを管理するようにSpringコンテナに通知する必要があります。これは、Martin Fowlerが作成したIoC(Inversion of Control)と呼ばれる方法論を使用して、Dependency Injection(DI)とも呼ばれます。
ある方法でBeanをワイヤリングするため、Beanへの依存をインスタンス化したり、依存関係を評価したりする必要はありません。これは一般にハリウッド原則として知られています。
Googleは、この質問でここに殺到するリンクに加えて、これについてさらに詳しく調べるのに最適なツールです。:)
Springには、Bag of Beanを運ぶIoCコンテナがあります。作成の維持と削除はSpring Containerの責任です。配線と自動配線により、春に豆を入れることができます。配線とは、XMLファイルに手動で構成することを意味し、「自動配線」とは、Javaファイルに注釈を配置してから、Java構成ファイルのルートコンテキストをSpringが自動的にスキャンして作成し、Springのバッグに入れることを意味します。
春豆はクラスです。(を使用してnew
)クラスをインスタンス化する代わりにbean
、アプリケーションコンテキストからクラス型へのキャストとしてインスタンスを取得します。Beanは、アプリケーションコンテキスト構成で構成したものです。このようにして、アプリケーション全体がアプリケーション全体でシングルトンスコープのインスタンスを維持します。アプリケーションコンテキストがインスタンス化された直後に、すべてのBeanは設定順序に従って初期化されます。アプリケーションでBeanを取得しなくても、アプリケーションコンテキストを作成した直後に、すべてのBeanインスタンスがすでに作成されています。
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として登録します。
Springでは、アプリケーションのバックボーンを形成し、Spring IoCコンテナーによって管理されるオブジェクトをBeanと呼びます。Beanは単に、Spring IoCコンテナによってインスタンス化、アセンブル、および管理されるオブジェクトです。
Springの場合、オブジェクトはすべてBeanです。Spring Frameworkの基本的なステップは、オブジェクトをBeanとして定義することです。Beanは、それらのクラス定義を調べることによってSpringフレームワークによって作成されるオブジェクトインスタンスにすぎません。これらの定義は、基本的に構成メタデータを形成します。次に、フレームワークは、この構成メタデータに基づいて、オブジェクトをインスタンス化する必要があるプラン、依存関係を設定および挿入する必要があるプラン、新しく作成されたインスタンスのスコープなどを作成します。
メタデータは、最初の章と同様に、単純なXMLファイルで提供できます。あるいは、メタデータを注釈またはJava構成として提供することもできます。
ブック:Just Spring
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();
}
}