2011年6月11日 星期六

spring IoC 使用factoryBean

最近才開使接觸spring IoC ,一般在XML 中設定 的 property 都是使用
......
<bean id="someBean" class="xxx.ooo.ClassName">
 "property name="someField" ref="anotherObject">  
</bean>
......
時都是指定到另一個bean 的,做為參考。換言之一定會存在著
......
<bean id="anotherObject" class="xx.oo.ClassName2">
  ......
</bean>
......

但有時候需要的是用factory的方式產生出來才塞給像上述的 someField的話要怎麼做呢?
上網路上查詢,發現有三個方式。 我自行理解後,筆記如下:
1.用static method 產生物件
2.用一般method產生物件
3.用透過 實作 FactoryBean interface

方法1說明:
以上述的例子來說,假設我們要注入xxx.ooo.ClassName 類別的 someField 欄位,原本是指到anotherObject 這個bean;現在有另一個類別提供一個static method 會產生出someField 需要的物件。

public class StaticFactoryBeanTest {

 public static SomeFieldClass createObject()
 {
               ......
       return someFieldInstance;
 }
}

在XML 中的使用方式為:
<bean id="xx" class="oo.xx.StaticFactoryBeanTest" factory-method="createObject" />


這時候,bean xx 指的就不是 oo.xx.StaticFactoryBeanTest的物件而是 它的static method :createObject 所產生的物件,注意在XML 中要這樣使用,此方法必需為static method

方法2說明:
在XML 中使用方式為:
<bean id="instanceFactoryBean" class="oo.xx.InstanceFactoryBean">
......
</bean>
<bean id="product" factory-bean="instanceFactoryBean" factory-method="createProduct" />
instanceFactoryBean 是一般的bean ,它的類別是oo.xx.InstanceFactoryBean
但 product 它是靠 instanceFactoryBean 的 createProduct 方法產生的物件,所以它的class不是oo.xx.InstanceFactoryBean,而是看createProduct 產生了什麼。

方法3說明:
在XML 中使用方式為:
<bean id="product" class="oo.xx.MyFactoryBean" />
oo.xx.MyFactoryBean 是implements org.springframework.beans.factory.FactoryBean 這個interface
而FactoryBean 有三個method 分別是:
public Object getObject();
public Class getObjectType();
public boolean isSingleton();

而這個product 注入的是 oo.xx.MyFactoryBean 的getObject()方法產生的物件,並非是oo.xx.MyFactoryBean這個類別的instance

沒有留言: