1つは、Beanのライフサイクルです。
いわゆるライフサイクルとは、オブジェクトの作成から破壊までのプロセス全体を指します。SpringコンテナはBeanのライフサイクルを管理できます。BeanがSpringコンテナにロードされると、そのライフサイクルがあり、SpringはBeanが使用されていることを確認する前に他の操作を実行します。
Beanのライフサイクルは、次のプロセスに分けられます。
(1)コンストラクターを介してBeanインスタンスを作成します(非パラメーター構築)。
(2)Beanプロパティおよび他のBeanへの参照の値を設定します(setメソッドを呼び出します)。
(3)Beanの初期化メソッドを呼び出します(初期化method-init-method属性を構成する必要があります)。
(4)Beanを使用します(オブジェクトを取得します)。
(5)コンテナが閉じたら、Beanのdestroyメソッドを呼び出します(destroyメソッドを設定する必要があります-destroy-method属性)。
次に、コードを使用して上記のプロセスを確認します。
(1)Studentクラスを作成します。
1)1番目と2番目のステップを検証するには、パラメーターなしの構文とsetメソッドに出力ステートメントを追加する必要があります。
2)initMethod()メソッドとdestroyMethod()メソッドをそれぞれ定義し、出力ステートメントを追加します。
public class Student {
private String name;
public Student(){
System.out.println("第一步:调用无参构造创建对象");
}
public void setName(String name) {
System.out.println("第二步:调用set方法注入属性值");
this.name = name;
}
public void initMethod(){
System.out.println("第三步:调用初始化方法");
}
public void destoryMethod(){
System.out.println("第五步:执行完毕,调用销毁方法");
}
}
(2)bean.xmlで構成します。
<!--
属性说明:
init-method:实体类中初始化的方法。
destroy-method:实体类中销毁的方法
-->
<bean id="student" class="com.yht.example3.entity.Student" init-method="initMethod" destroy-method="destoryMethod">
<property name="name" value="YHT"></property>
</bean>
(3)テストを実行します。
@Test
public void testLive(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Student student = context.getBean("student", Student.class);
System.out.println("第四步:获取到对象实例 \t" + student);
// ApplicationContext中没有close()方法,而是在子类ClassPathXmlApplicationContext中
context.close();
}
実行結果は以下のとおりです。
上記は、SpringでのBeanのライフサイクルの5つのプロセスです。さらに、SpringでのBeanの初期化の前後に2つのプロセスがあり、Beanのポストプロセッサを介して完了します。
(1)MyBeanPostを定義し、BeanPostProcessorインターフェースを実装し、その中のメソッドをオーバーライドします。
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("我在初始化之前执行");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("我在初始化之后执行");
return bean;
}
}
(2)bean.xmlでmyBeanPostを構成します。
<bean id="myBeanPost" class="com.yht.example3.posthandler.MyBeanPost"></bean>
(3)単体テストを実行し、次の結果を取得します。
これから、Beanのライフサイクルの7つのステップを取得できます。
(1)コンストラクターを介してBeanインスタンスを作成します(非パラメーター構築)。
(2)Beanプロパティおよび他のBeanへの参照の値を設定します(setメソッドを呼び出します)。
(3)初期化前に実行される操作。
(4)Beanの初期化メソッドを呼び出します(初期化method-init-method属性を構成する必要があります)。
(5)初期化後に実行される操作。
(6)Beanを使用します(オブジェクトを取得します)。
(7)コンテナが閉じたら、Beanのdestroyメソッドを呼び出します(destroyメソッドを設定する必要があります-destroy-method属性)。
第二に、Beanのスコープ
SpringがBeanのインスタンスを初期化するときに、インスタンスのスコープを指定できます。Springでは5種類のスコープが定義されています。一般的に使用されるスコープはシングルトン(シングルケース)とプロトタイプ(マルチケース)です。詳細は次のとおりです。
属性 | 説明 |
---|---|
シングルトン | シングルトンモード。シングルトンで定義されたBeanは、Springコンテナにインスタンスが1つだけあります。これは、Beanのデフォルトスコープでもあります。 |
プロトタイプ | プロトタイプモード。プロトタイプで定義されたBeanがSpringコンテナを介して取得されるたびに、コンテナは新しいBeanインスタンスを作成します。 |
リクエスト | HTTPリクエストでは、コンテナはBeanの同じインスタンスを返します。異なるHTTPリクエストの場合、異なるインスタンスが返され、スコープは現在のHTTPリクエスト内でのみ有効です。 |
セッション | HTTPセッションでは、コンテナはBeanの同じインスタンスを返します。異なるHTTPリクエストの場合、異なるインスタンスが返され、スコープは現在のHTTPセッションでのみ有効です。 |
グローバルセッション | グローバルHTTPセッションでは、コンテナはBeanの同じインスタンスを返します。このスコープは、ポートレットコンテキストを使用する場合にのみ有効です。 |
1、シングルトン
シングルトンはSpringコンテナのデフォルトスコープです。Beanのスコープがシングルトンの場合、Springコンテナには共有Beanインスタンスが1つだけあり、IDがBean定義と一致する限り、Beanへのすべてのリクエストのみが行われます。 Beanの同じインスタンスを返します。
Spring構成ファイルでは、<bean>要素のscope属性を使用して、Beanのスコープをシングルトンとして定義できます。構成方法は次のとおりです。
<bean id="teacher" class="com.yht.example3.entity.Teacher" scope="singleton"></bean>
次のプログラムを使用して、2回取得した教師の住所が同じであることを確認します。これは、現時点での教師がシングルトンであり、グローバルに一意であることを示しています。
@Test
public void testTeacher(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Teacher teacher1 = context.getBean("teacher", Teacher.class);
Teacher teacher2 = context.getBean("teacher", Teacher.class);
System.out.println("teacher1的地址 : " + teacher1);
System.out.println("teacher2的地址 : " + teacher2);
}
2、プロトタイプ
プロトタイプスコープを使用するBeanは、Beanが要求されるたびに新しいBeanインスタンスを作成します。したがって、プロトタイプスコープは、セッション状態を維持する必要があるBean(Structs 2のActionクラスなど)に使用する必要があります。上記の例のスコープ属性をプロトタイプに変更してテストすると、2回取得した結果に一貫性がないことがわかります。これは、オブジェクトのケースが多いことを示しています。
<bean id="teacher" class="com.yht.example3.entity.Teacher" scope="prototype"></bean>
実行結果は以下のとおりです。
3.シングルトンとプロトタイプの違い
違い1:シングルトンはシングルトンであり、プロトタイプは複数のインスタンスです。
違い2:socpeがシングルトンに設定されている場合、Spring構成ファイルがロードされるときにシングルトンオブジェクトが作成されます。socpeがprototypeに設定されている場合、getBeanが呼び出されたときにオブジェクトが作成されます。
3つ、3つのBeanインスタンス化方法
Springでは、コンテナでBeanを使用する場合は、Beanをインスタンス化する必要もあります。Beanをインスタンス化するには、コンストラクターのインスタンス化、静的ファクトリのインスタンス化、インスタンスファクトリのインスタンス化の3つの方法があります。コンストラクターのインスタンス化は、最も一般的に使用される方法の1つであり、他の方法も理解できます。
1.コンストラクターのインスタンス化
コンストラクターのインスタンス化とは、Springコンテナーが、Beanに対応するクラスのデフォルトの引数なしの構築メソッドを介してBeanをインスタンス化することを意味します。
(1)Teacherクラスを作成します
public class Teacher {
private String name;
private String major;
public void setName(String name) {
this.name = name;
}
public void setMajor(String major) {
this.major = major;
}
public void showMessage(){
System.out.println("教师:" + this.name + ",方向:" + this.major);
}
}
(2)bean.xmlで構成します。
<bean id="teacher1" class="com.yht.example3.entity.Teacher">
<property name="name" value="赵茜"></property>
<property name="major" value="网络"></property>
</bean>
(3)ユニットテストを実行します。
@Test
public void testCommon(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Teacher teacher = context.getBean("teacher1", Teacher.class);
teacher.showMessage();//教师:赵茜,方向:网络
}
2.静的ファクトリインスタンス化
(1)MyStaticFactoryクラスを作成し、静的メソッドcreateObject()を作成してTeacherインスタンスを返します。
public class MyStaticFactory {
public static Teacher createObject(){
return new Teacher();
}
}
(2)bean.xmlで構成します。
<!-- 静态工厂实例化 -->
<!--
class:静态工厂的类。
factory-method:静态工厂中的方法
-->
<bean id="teacher2" class="com.yht.example3.factory.MyStaticFactory" factory-method="createObject">
<property name="name" value="孙飞"></property>
<property name="major" value="人工智能"></property>
</bean>
(3)ユニットテストを実施。
@Test
public void testStatic(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Teacher teacher = context.getBean("teacher2", Teacher.class);
teacher.showMessage();//教师:孙飞,方向:人工智能
}
3.インスタンスファクトリのインスタンス化
(1)MyCommonFactoryクラスを作成し、メソッドcreateObject()を作成してTeacherインスタンスを返します。
public class MyCommonFactory {
public Teacher createObject(){
return new Teacher();
}
}
(2)bean.xmlで構成します。
<!-- 实例工厂实例化 -->
<!--
factory-bean :指向配置的实例工厂
factory-method:静态工厂中的方法
-->
<bean id="teacher3" factory-bean="teacherFactory" factory-method="createObject">
<property name="name" value="郭安"></property>
<property name="major" value="车联网"></property>
</bean>
<!-- 配置工厂 -->
<bean id="teacherFactory" class="com.yht.example3.factory.MyCommonFactory"></bean>
(3)ユニットテストを実施。
@Test
public void testInstance(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
Teacher teacher = context.getBean("teacher3", Teacher.class);
teacher.showMessage();//教师:郭安,方向:车联网
}
4.3つのインスタンス化方法の違い
コンストラクターのインスタンス化:パラメーターなしの構築方法を使用してBeanをインスタンス化します。その本質は、対応するクラスのBeanを管理のためにSpring独自のファクトリ(BeanFactory)に渡すことであり、Spring独自のファクトリモデルはこれを作成および維持するのに役立ちます。クラス。
インスタンス化の静的ファクトリメソッド:静的ファクトリを介してBeanを作成して返します。本質は、Beanに対応するクラスを独自の静的ファクトリ管理に引き渡すことです。Springは、静的ファクトリのインスタンスを作成するメソッドを呼び出すのに役立ちました。アプリケーション:サードパーティのjarパッケージによって提供されるクラスを使用する場合、このクラスには構築メソッドがないため、サードパーティのパッケージによって提供される静的ファクトリを介して作成されることがよくあります。サードパーティのjarパッケージSpringによって管理されている場合は、Springが提供する静的ファクトリを使用してインスタンスの構成を作成できます。
インスタンスファクトリのインスタンス化方法:インスタンスファクトリを介してBeanを作成して返します。本質は、ファクトリクラスを作成し、ファクトリクラスのメソッドを呼び出すプロセスをSpringによってインスタンスを作成するメソッドに引き渡すことです。作成プロセスインスタンスも独自のものです。構成されたインスタンスファクトリは内部で実装されます。アプリケーション:たとえば、SpringとHibernateの統合はこの方法で実現されます。ただし、Springと統合されていないファクトリクラスの場合、通常はコードを使用して自分で管理します。