SpringBeanFactoryとFactoryBeanの違い

まず、BeanFactoryとFactoryBeanの違いを要約します

BeanFactroy SpringのBeanファクトリは、クラスを生成してオブジェクトを取得できます。たとえば、クラスの1つが管理のためにSpringに渡され、このBeanFactroyを介してBeanNameを直接取得できます。

FactroyBeanは、春の特別なBeanです。3つのメソッドを実装するインターフェイスです。FactroyBeanを実装するBeanは、getObject()メソッドによって実際に返されるBeanであるBeanを作成できます。

これらはさまざまな形式でSpringコンテナに存在します。FactroyBeanを実装するBeanを取得する必要がある場合は、BeanNameの前に「&」記号を追加して取得する必要があります。getObject()メソッドによって実際に返されるBeanを取得する必要がある場合は、BeanNameを直接取得します。

達成するためのコードを見てみましょう

まず、次のように普通のオブジェクトに行きましょう。

package org.springframework.test.main.entity;

public class Student {

	public void query(){
		System.out.println("org.springframework.test.main.entity.Student.query");
	}

}

これは、スプリングによって管理される別のクラスです。これは、アノテーションを使用してここで実行されます。

package org.springframework.test.main.entity;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component
public class Parent implements FactoryBean {
	@Override
	public Object getObject() throws Exception {
		return new Student();
	}

	@Override
	public Class<?> getObjectType() {
		return Student.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	public void query(){
		System.out.println("org.springframework.test.main.entity.Parent.query");
	}
}

クラスをもう一度テストしてみましょう

package org.springframework.test.main;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.main.config.ScanConfig;
import org.springframework.test.main.entity.Parent;
import org.springframework.test.main.entity.Student;

public class MainDemo {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ScanConfig.class);
		Parent parent =(Parent) ac.getBean("parent");
		parent.query();
	}

}

getBeanのこのコード行に注目しましょう。通常の状況では、親がFactoryBeanインターフェースを実装していない場合、親でquery()メソッドを呼び出すことができます。

しかし、FactoryBeanインターフェースが実装されると、内部のgetObject()メソッドが書き直され、このメソッドによって返されるBeanが最終的に取得されたBeanになります。
この結論として、上記のコードを実行すると明らかにエラーが報告されます。型変換が表示されます。例外。
 

D:\java\jdk8\bin\java.exe "
Exception in thread "main" java.lang.ClassCastException: org.springframework.test.main.entity.Student cannot be cast to org.springframework.test.main.entity.Parent
	at org.springframework.test.main.MainDemo.main(MainDemo.java:12)

Process finished with exit code 1

変更してみましょう。アンパサンドをgetBean( "&parent");に追加すると、実行時に親のquery()メソッドが正常に呼び出されることがわかります。

上記の型変換例外の問題に戻りましょう。親をgetObject()メソッドで返されたStudentに変更すると、Studentのquery()メソッドが正常に呼び出されました。つまり、Student parent =(Student)ac.getBean( "parent");

 

Springコンテナーが開始されると、@ Componentアノテーションが付けられたオブジェクトが、この記事のParentなど、管理のためにSpringコンテナーに渡されることがわかっています。直接取得すると、getBean( "parent")を取得できます。通常は。ただし、BeanがFactoryBeanインターフェースを実装し、内部のgetObject()メソッドを上書きする場合、このBeanを取得するためにgetBean( "&parent")を追加する必要があり、getObject()メソッドによって返されるオブジェクトはGetBean( "parent")になります。直接。
たとえば、テキスト内のテキストは正常です

Parent parent =(Parent) ac.getBean("&parent");//实现了FactoryBean的bean
Student parent =(Student) ac.getBean("parent");//实现了FactoryBean的bean重写的getObject()方法中返回的Bean

これは上記の要約に対する良い答えです

最も一般的なアプリケーションシナリオは、MybaitsのSqlSessionFactoryオブジェクトです。
 

おすすめ

転載: blog.csdn.net/qq_38108719/article/details/93489624