Bean定義
Beanオブジェクトは、アプリケーションが春のIoCコンテナによって管理されている柱を構成するために呼ばれています。豆は、アセンブリ、インスタンス化、およびスプリングIoCコンテナによって管理されるオブジェクトを介して行われています。これらの豆が備える構成メタデータコンテナが作成され、例えば、前のセクション、XML形式の定義に見られました。
Bean定義が含まれているとして知られている構成メタデータの情報を、コンテナには、次の構成メタデータを知っておく必要があります。
-
Beanを作成する方法
-
豆のライフサイクルの詳細については、
-
豆の依存性
各Beanを構成する上記構成データのすべてのメタデータのセットには、以下のプロパティを定義しました。
プロパティ 説明 クラス このプロパティは必須とBeanのBeanクラスを作成するように指定されています。 名 この属性は、一意の識別子Beanを指定します。XMLベースのメタデータの設定は、Beanの識別子を指定するには、IDおよび/またはname属性を使用することができます。 範囲 コンストラクタ、引数 これは、依存性注入を使用し、次のセクションで説明します。 プロパティ これは、依存性注入を使用し、次のセクションで説明します。 オートワイヤリングモード これは、依存性注入を使用し、次のセクションで説明します。 レイジー初期化モード それが最初に要求されたときに豆の遅延初期化は、それが起動時にBeanインスタンスを作成するのではなく、IoCコンテナに語りました。 初期化メソッド 豆容器の必要なすべてのプロパティが設定された後、コールバックメソッドを呼び出します。これは、Beanのライフサイクルの章を説明します。 破壊方法 豆を含む容器が破壊された場合、コールバックメソッドを使用して。これは、Beanのライフサイクルの章を説明します。 以下の図は、春豆容器との間の関係を示します
ビーンのスコープ
春にBeanを定義するときは、スコープにオプション豆文を持っています。たとえば、春は新しいBeanインスタンスに必要なすべての時間を生産している強制するために、あなたはのためのBeanのプロパティのスコープ宣言しなければならないプロトタイプを。あなたが春をしたい場合は同様に、すべての時間はあなたがすべて同じBeanインスタンスを返す必要がある、あなたはのためのBeanのプロパティのスコープを宣言する必要がありシングルトンを。
春のフレームワークは、シングルトン、プロトタイプ、要求、セッション、およびグローバルセッションはそれぞれ、以下の5つのスコープをサポートし、5種の範囲は、以下で説明します
あなたがウェブ対応のApplicationContextのを使用している場合、の3が利用可能であることに注意してください。
スコープ | 説明 |
---|---|
シングルトン | 春のIoCコンテナは、単一の実施形態の存在下で、デフォルト値を一例に過ぎ豆、豆の方法が存在します |
プロトタイプ | 毎回コール豆は、コンテナの新しいインスタンスを返す、すなわち、実装newXxxBeanに相当getBean()を呼び出すたびに、() |
要求 | 各HTTPリクエストは、新しいBeanを作成し、その範囲は、環境だけに適用されますWebApplicationContext |
セッション | 唯一の環境WebApplicationContextに適用され、同じHTTPセッションBean、異なる豆を使用して別のセッションを共有 |
グローバルセッション | 一般的な環境のためのポートレット・アプリケーションは、ドメインの使用は、環境WebApplicationContextに適用されます |
シングルトンスコープ:
シングルトンを使用すると、設定項目の範囲を指定しない場合、Beanの定義は、ビーンのスコープは、デフォルトのシングルトンである場合には、デフォルトのスコープです。
当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
也就是说,当将一个bean定义设置为singleton作用域的时候,Spring IoC容器只会创建该bean定义的唯一实例。
Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。你可以在 bean 的配置文件中设置作用域的属性为 singleton
<bean id="desk2" class="com.qyx.Bean.Desk" scope="singleton"> <constructor-arg name="id" value="10"></constructor-arg> <constructor-arg name="price" value="20"></constructor-arg> </bean>
package com.qyx; import com.qyx.Bean.Desk; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String args[]) { ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml"); Desk desk =applicationContext.getBean("desk2", Desk.class); //取出spring applicationContext.xml中所管理的所有的bean的id //其方法返回的是一个String数组 String[] beansName=applicationContext.getBeanDefinitionNames(); for(String string:beansName) { System.out.println(string); } desk.setId(50); Desk desk2=applicationContext.getBean("desk2",Desk.class); System.out.println(desk.getId()); } }
prototype 作用域
当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
<bean id="desk3" class="com.qyx.Bean.Desk" scope="prototype"> <constructor-arg name="id" value="20"></constructor-arg> <constructor-arg name="price" value="60"></constructor-arg> </bean>
package com.qyx;
import com.qyx.Bean.Desk;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String args[])
{
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
Desk desk =applicationContext.getBean("desk3", Desk.class);
//取出spring applicationContext.xml中所管理的所有的bean的id
//其方法返回的是一个String数组
String[] beansName=applicationContext.getBeanDefinitionNames();
for(String string:beansName)
{
System.out.println(string);
}
System.out.println(desk.getId());
}
}