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
, ServiceLocatorFactoryBean
logger
コンストラクターと説明 |
---|
ObjectFactoryCreatingFactoryBean() |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() 必要に応じて、シングルトンインスタンスを積極的に作成します。 |
protected ObjectFactory<ObjectSE> | createInstance() このファクトリによって返されるオブジェクトを構築するためにサブクラスがオーバーライドする必要があるテンプレートメソッド。 |
ClassSE<?> | getObjectType() この抽象メソッドの宣言は、FactoryBean インターフェースのメソッドを反映しており、抽象テンプレートメソッドを一貫して提供します。 |
void | setTargetBeanName(StringSE targetBeanName) ターゲット Bean の名前を設定します。 |
destroy, destroyInstance, getBeanFactory, getBeanTypeConverter, getEarlySingletonInterfaces, getObject, isSingleton, setBeanClassLoader, setBeanFactory, setSingleton
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public void setTargetBeanName(StringSE targetBeanName)
ターゲットは非シングルトン Bean である必要はありませんが、現実的には常にそうです(ターゲット Bean がシングルトンである場合、そのシングルトン Bean は依存オブジェクトに直接注入できるため、追加のレベルの必要性がなくなります)このファクトリアプローチによって提供される間接参照)。
public void afterPropertiesSet() throws ExceptionSE
AbstractFactoryBean
InitializingBean
の afterPropertiesSet
AbstractFactoryBean<ObjectFactory<ObjectSE>>
の afterPropertiesSet
ExceptionSE
- 構成の誤り(必須プロパティの設定の失敗など)の場合、またはその他の理由で初期化が失敗した場合 public ClassSE<?> getObjectType()
AbstractFactoryBean
FactoryBean<ObjectFactory<ObjectSE>>
の getObjectType
AbstractFactoryBean<ObjectFactory<ObjectSE>>
の getObjectType
null
FactoryBean.getObjectType()
protected ObjectFactory<ObjectSE> createInstance()
AbstractFactoryBean
シングルトンの場合はこの FactoryBean の初期化時に呼び出され、そうでない場合は各 AbstractFactoryBean.getObject()
コール時に呼び出されます。
AbstractFactoryBean<ObjectFactory<ObjectSE>>
の createInstance
AbstractFactoryBean.getObject()