Beanオブジェクトは、アプリケーションの基本的な構成は、春IOCコンテナによって管理されて呼び出されますが、Beanプロパティのために典型的には約含まれています
プロパティ | 説明 |
---|---|
クラス | 属性の完全修飾名は必須であり、Beanを作成するために、Beanクラスを指定します。 |
名前 | この属性は、一意の識別子Beanを指定します。XMLベースのメタデータの設定は、Beanの識別子を指定するには、IDおよび/またはname属性を使用することができます。 |
範囲 | この属性は、それがスコープの章豆に説明する、スコープの特別なBean定義によって作成されたオブジェクトを指定します。 |
コンストラクタ、引数 | これは、依存性注入を使用し、次のセクションで説明します。 |
プロパティ | これは、依存性注入を使用し、次のセクションで説明します。 |
オートワイヤリングモード | これは、依存性注入を使用し、次のセクションで説明します。 |
レイジー初期化モード | それが最初に要求されたときに豆の遅延初期化は、それが起動時にBeanインスタンスを作成するのではなく、IoCコンテナに語りました。 |
初期化メソッド | 豆容器の必要なすべてのプロパティが設定された後、コールバックメソッドを呼び出します。これは、Beanのライフサイクルの章を説明します。 |
破壊方法 | 豆を含む容器が破壊された場合、コールバックメソッドを使用して。これは、Beanのライフサイクルの章を説明します。 |
ビーン識別子が設定を表示しないことがあり、春は、AccountServiceの、名前等に基づいてuserDao Beanオブジェクトのような標準的な命名法豆セット識別子に従ってこぶデフォルト設定されますが、(異常な)特別な状況では、複数の文字と、第1および第2の文字が大文字であるされている場合は、オリジナルのケースを保持します。
ビーンのスコープ
春にBeanを定義するときは、スコープにオプション豆文を持っています。たとえば、春は新しいBeanインスタンスに必要なすべての時間を生産している強制するために、あなたはのためのBeanのプロパティのスコープ宣言しなければならない プロトタイプを。あなたが春をしたい場合は同様に、すべての時間はあなたがすべて同じBeanインスタンスを返す必要がある、あなたはのためのBeanのプロパティのスコープを宣言する必要があり シングルトンを。
春のフレームワークは、シングルトン、プロトタイプ、要求、セッション、およびグローバルセッションはそれぞれ、以下の5つのスコープをサポートし、5種のスコープは、Web対応ののApplicationContextを使用している場合、の3が利用可能であることを、下記の注意事項を説明しました。
スコープ | 説明 |
---|---|
シングルトン | 春のIoCコンテナは、単一の実施形態の存在下で、デフォルト値を一例に過ぎ豆、豆の方法が存在します |
プロトタイプ | 毎回コール豆は、コンテナの新しいインスタンスを返す、すなわち、実装newXxxBeanに相当getBean()を呼び出すたびに、() |
リクエスト | 各HTTPリクエストは、新しいBeanを作成し、その範囲は、環境だけに適用されますWebApplicationContext |
セッション | 唯一の環境WebApplicationContextに適用され、同じHTTPセッションBean、異なる豆を使用して別のセッションを共有 |
グローバルセッション | 一般的な環境のためのポートレット・アプリケーションは、ドメインの使用は、環境WebApplicationContextに適用されます |
以下は、前の2つのスコープを使用して説明されます。テスト目的のために、私たちは次のように、POJO(LifeScope.java)及び試験方法を再作成する必要があります。
/ ** * @authorジョンソン劉 * @descriptionビーン的生命周期测试POJO类 * / publicクラスLifeScope { プライベート文字列名; 公共のボイドのgetName(int型数値){ System.out.printlnは( "あなたの名前:" +名+ ">>>" + NUM); } 公共ボイドのsetName(文字列名){ this.name =名。 } }
インタフェースとその実装クラスLifeService.java LifeServiceImpl.javaを定義します。
パッケージスコープ。 輸入quickstart.LifeScope; パブリック インターフェースLifeService { / ** * * @param lifeScope作用域测试 * / ボイドsetLife(LifeScope lifeScope)。 LifeScope getLife()。 }
パッケージスコープ。 輸入quickstart.LifeScope; / ** * @author ジョンソン劉 * @description豆生命周期测试 * / パブリック クラス LifeServiceImpl 実装LifeService { プライベートLifeScope lifeScope。 / ** * @param lifeScope作用域测试 * / 公共 ボイドsetLife(LifeScope lifeScope){ この .lifeScope = lifeScope。 } 公共LifeScope getLife(){ 戻り 、この.lifeScopeと、 } }
テストするために、オブジェクトの参照インスタンス場合は、このインスタンスをビーンSpringコンテナは、単一のケースまたは複数のケースでインスタンス化し、あなたはまた、(複数のスレッドによって、我々は実装クラスの複数のインスタンスを取得することができ、テストに簡単なマルチスレッドクラスを作成する必要があり、出力それはそうでない場合は、複数のケースに属し、シングルトンであるように、アドレス;第二に、これら二つのモデルの異なる使用を区別するために、内部のスレッドNUMプライベート変数は、スレッド出力を区別するための方法として作成):
パッケージスコープ。 輸入org.springframework.context.ApplicationContext; 輸入quickstart.LifeScope; 輸入java.util.Randomの。 / ** * @author ジョンソン劉 * @description * / パブリック クラス LifeThreadは拡張スレッド{ プライベートのApplicationContextコンテキストを。 プライベートLifeScope lifeScope。 プライベート整数NUM; パブリックLifeThread(){ } 公共 LifeThread(int型NUM、ApplicationContextのコンテキスト、LifeScope lifeScope){ この.context = 文脈。 この .lifeScope = lifeScope。 この .num = NUM; } @Override 公共 ボイドラン(){ 長い時間=(長)(Math.random()* 1000 + 1 )。 試す{ LifeServiceImpl lifeService =((LifeServiceImpl)context.getBean( "lifeService" )); System.out.println(lifeService)。 lifeService.setLife(lifeScope)。 Thread.sleep(時間); LifeScope returnLifeScope = lifeService.getLife()。 returnLifeScope.getName(NUM)。 } キャッチ(例外e){ } } }
設定beans.xmlの、LifeServiceImplはSpringコンテナによって管理されてみましょう:
<?xmlのバージョン= "1.0"エンコード= "UTF-8"> <豆のxmlns = "http://www.springframework.org/schema/beans" のxmlns:XSI = "http://www.w3.org / 2001 / XMLスキーマ・インスタンス」 のxsi:のschemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <ビーンID = "のhelloWorld" クラス = "quickstart.HelloWorld"> <! - <コンストラクタ、引数名= "メッセージ"値= "使用XML进行构造函数注入"> </コンストラクタ、引数> - > <プロパティ名= "メッセージ"値="こんにちは世界"> </ property>の </豆> <! - <豆ID ="lifeService」 クラス = "scope.LifeServiceImpl"スコープ= "プロトタイプ"> </ビーン> - > <ビーンID = "lifeService" クラス= "scope.LifeServiceImpl"スコープ= "シングルトン"> </ビーン> </豆>
書き込みテストコード:
パッケージのクイックスタート。 輸入org.springframework.context.ApplicationContext; 輸入org.springframework.context.annotation.AnnotationConfigApplicationContext; 輸入org.springframework.context.support.ClassPathXmlApplicationContext; 輸入org.springframework.context.support.FileSystemXmlApplicationContext; 輸入scope.LifeServiceImpl; 輸入scope.LifeThread; パブリック クラスMainTest { 公共 静的 ボイドメイン(文字列[]引数){ / ** BeanオブジェクトとオブジェクトBeanを維持する; *のApplicationContextは、構成ファイル、生成されたロード管理オブジェクトを読み取るためのスプリングが責任、インタフェースでありますBeanのライフサイクルに責任依存関係の間。 * ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、ApplicationContextのインタフェースの実装クラスであるAnnotationConfigApplicationContextよう クラスパスからClassPathXmlApplicationContext Spring構成ファイルを読み取るため* ローディング・アプリケーション・コンテキストのためのファイルシステムから* FileSystemXmlApplicationContext * Javaクラスからのアプリケーション・コンテキストをロードするAnnotationConfigApplicationContext * / ApplicationContextのコンテキスト = 新しい新 ClassPathXmlApplicationContext( "beans.xmlの"); // クラス・パス・ロード・アプリケーション・コンテキストからの // のApplicationContext FileSystemXmlApplicationContext新しい新しいコンテキスト=(「D:\\ IdeaProjectsスプリング\\ \\ \\のJavaコアSRC \\ \ \ \\リソース\\メインbeans.xmlの「); // ファイルシステムからアプリケーション・コンテキストをロードする //ApplicationContextのコンテキスト=新しいAnnotationConfigApplicationContext( "クイックスタート")。// 从Javaの类中加载应用上下文 / * のHelloWorldのhelloWorld =(HelloWorldの)context.getBean( "のhelloWorld"); helloWorld.getMessage(); * / LifeServiceImpl lifeService =(LifeServiceImpl)context.getBean( "lifeService" )。 LifeScope lifeScope1 = 新しいLifeScope(); lifeScope1.setName( "スコープ测试1" )。 LifeScope lifeScope2 = 新しいLifeScope(); lifeScope2.setName( "スコープ测试2" )。 LifeScope lifeScope3 = 新しいですLifeScope(); lifeScope3.setName( "スコープ测试3" )。 LifeScope lifeScope4 = 新しいLifeScope(); lifeScope4.setName( "スコープ测试4" )。 LifeScope lifeScope5 = 新しいLifeScope(); lifeScope5.setName( "スコープ测试5" )。 LifeScope lifeScope6 = 新しいLifeScope(); lifeScope6.setName( "スコープ测试6" ); 新しい LifeThread(1 、コンテキスト、lifeScope1).start(); 新しい LifeThread(2 、コンテキスト、lifeScope2).start(); 新着LifeThread(3 、コンテキスト、lifeScope3).start(); 新しい LifeThread(4 、コンテキスト、lifeScope4).start(); 新しい LifeThread(5 、コンテキスト、lifeScope5).start(); 新しい LifeThread(6 、コンテキスト、lifeScope6).start(); } }
次のように現時点では、シングルトンスコープを使用している、テスト結果は以下のとおりです。
テスト結果から見ることができ、我々は同じオブジェクトを取得していますが、私有財産を割り当てることによって、対象のBeanインスタンス後の出力は、その値が現在のスレッド設定した値ではないことを、オブジェクトのBeanインスタンス。ここでは、改修範囲=「プロトタイプ」の結果として、Beanのスコープで見て:
<ビーンID =「lifeService」クラス =「scope.LifeServiceImpl」スコープ=「プロトタイプ」>この行は、上記のコメントのbeans.xmlのにキャンセルされます// </豆>
我々はマルチスレッドで見つかった以上の試験結果から、マルチパターンは、スレッドセーフです。グローバル含むビーンビーンの一般的な私有財産、私たちは、ステートフルBeanを呼び出し、その逆ステートレスBeanの。
そのため、ステートフルBeanのこのタイプを定義するために、我々は確かにプロトタイプモードとしてその範囲を宣言したいです。