まず、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オブジェクトです。