public class ObjectFactoryCreatingFactoryBean extends AbstractFactoryBean<ObjectFactory<ObjectSE>>
ObjectFactory である値を返す FactoryBean 実装は、BeanFactory をソースとする Bean を返します。 そのため、これを使用して、クライアントオブジェクトが BeanFactory.getBean(String) を直接呼び出して、BeanFactory から(通常はプロトタイプ)Bean を取得するのを防ぐことができます。これは、制御原理の反転に違反します。代わりに、このクラスを使用して、クライアントオブジェクトに、1 つのターゲット Bean(これも通常はプロトタイプ Bean)のみを直接返すプロパティとして ObjectFactory インスタンスを供給することができます。
XML ベースの BeanFactory のサンプル構成は次のようになります。
<beans>
<!-- Prototype bean since we have state -->
<bean id="myService" class="a.b.c.MyService" scope="prototype"/>
<bean id="myServiceFactory"
class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName"><idref local="myService"/></property>
</bean>
<bean id="clientBean" class="a.b.c.MyClientBean">
<property name="myServiceFactory" ref="myServiceFactory"/>
</bean>
</beans> アテンダント MyClientBean クラスの実装は次のようになります。
package a.b.c;
import org.springframework.beans.factory.ObjectFactory;
public class MyClientBean {
private ObjectFactory<MyService> myServiceFactory;
public void setMyServiceFactory(ObjectFactory<MyService> myServiceFactory) {
this.myServiceFactory = myServiceFactory;
}
public void someBusinessMethod() {
// get a 'fresh', brand new MyService instance
MyService service = this.myServiceFactory.getObject();
// use the service object to effect the business logic...
}
} オブジェクト作成パターンのこのアプリケーションへの代替アプローチは、ServiceLocatorFactoryBean を使用して(プロトタイプ)Bean を調達することです。ServiceLocatorFactoryBean アプローチには、ObjectFactory などの Spring 固有のインターフェースに依存する必要がないという利点がありますが、ランタイムクラスの生成が必要になるという欠点があります。この課題の詳細については、ServiceLocatorFactoryBean JavaDoc を参照してください。
ObjectFactory, ServiceLocatorFactoryBeanloggerOBJECT_TYPE_ATTRIBUTE| コンストラクターと説明 |
|---|
ObjectFactoryCreatingFactoryBean() |
| 修飾子と型 | メソッドと説明 |
|---|---|
void | afterPropertiesSet() 必要に応じて、シングルトンインスタンスを積極的に作成します。 |
protected ObjectFactory<ObjectSE> | createInstance() このファクトリによって返されるオブジェクトを構築するためにサブクラスがオーバーライドする必要があるテンプレートメソッド。 |
ClassSE<?> | getObjectType() この抽象メソッドの宣言は、FactoryBean インターフェースのメソッドを反映しており、抽象テンプレートメソッドを一貫して提供します。 |
void | setTargetBeanName(StringSE targetBeanName) ターゲット Bean の名前を設定します。 |
destroy, destroyInstance, getBeanFactory, getBeanTypeConverter, getEarlySingletonInterfaces, getObject, isSingleton, setBeanClassLoader, setBeanFactory, setSingletoncloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEpublic void setTargetBeanName(StringSE targetBeanName)
ターゲットは非シングルトン Bean である必要はありませんが、現実的には常にそうです(ターゲット Bean がシングルトンである場合、そのシングルトン Bean は依存オブジェクトに直接注入できるため、追加のレベルの必要性がなくなります)このファクトリアプローチによって提供される間接参照)。
public void afterPropertiesSet()
throws ExceptionSEAbstractFactoryBeanInitializingBean の afterPropertiesSet AbstractFactoryBean<ObjectFactory<ObjectSE>> の afterPropertiesSet ExceptionSE - 構成の誤り(必須プロパティの設定の失敗など)の場合、またはその他の理由で初期化が失敗した場合 public ClassSE<?> getObjectType()
AbstractFactoryBeanFactoryBean<ObjectFactory<ObjectSE>> の getObjectType AbstractFactoryBean<ObjectFactory<ObjectSE>> の getObjectType null FactoryBean.getObjectType()protected ObjectFactory<ObjectSE> createInstance()
AbstractFactoryBean シングルトンの場合はこの FactoryBean の初期化時に呼び出され、そうでない場合は各 AbstractFactoryBean.getObject() コール時に呼び出されます。
AbstractFactoryBean<ObjectFactory<ObjectSE>> の createInstance AbstractFactoryBean.getObject()