spring factory-method和factory-bean 使用

配置工廠Bean
通常由應用程序直接使用new創建新的對象,爲了將對象的創建和使用相分離,採用工廠模式,即應用程序將對象的創建及初始化職責交給工廠對象.
一般情況下,應用程序有自己的工廠對象來創建bean.如果將應用程序自己的工廠對象交給Spring管理,那麼Spring管理的就不是普通的bean,而是工廠Bean.
調用getBean()方法,Spring返回的不是直接創建的Bean的實例,而是由工廠Bean創建的Bean實例.
一般在Spring中配置工廠Bean,有3中不同類型的工廠Bean的配置.
1.靜態工廠
創建具體Bean實例的是靜態方法

import java.util.Random;
public class StaticFactoryBean {
public static Integer createRandom() {
return new Integer(new Random().nextInt());
}
}
將其納入Spring容器來管理,需要通過factory-method指定靜態方法名稱
<bean id="random"
class="example.chapter3.StaticFactoryBean"
factory-method="createRandom" //createRandom方法必須是static的,才能找到
scope="prototype"
/>
測試:
public static void main(String[] args) {

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("random").toString());
//StaticFactoryBean sfb = (StaticFactoryBean)factory.getBean("random");
//System.out.println(sfb.createRandom().toString());
//調用getBean()時,返回隨機數.如果沒有指定factory-method,會返回StaticFactoryBean的實例,即返回工廠Bean的實例
}

2.實例工廠
創建具體Bean實例的是實例,不是靜態方法

import java.text.SimpleDateFormat;
import java.util.Date;
public class InstanceFactoryBean {
private String format = "yy-MM-dd HH:mm:ss";
public void setFormat(String format) {
this.format = format;
}
public String createTime() {
return new SimpleDateFormat(format).format(new Date());
}
}
配置文件需要配置兩個bean:第一個Bean和普通的Bean沒有區別,第二個bean定義如何通過工廠Bean獲取Bean,需要指定工廠Bean的名稱和方法名稱
<bean id="instanceFactoryBean" class="example.chapter3.InstanceFactoryBean">
<property name="format" value="yyyy-MM-dd HH:mm:ss" />
</bean>
<bean id="currentTime"
factory-bean="instanceFactoryBean"
factory-method="createTime"
/>
測試:
public static void main(String[] args) {

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("currentTime"));

}
3.實現FactoryBean接口
public class PiFactoryBean implements FactoryBean {
public Object getObject() throws Exception {
return new Double(3.14159265358979);
}
public Class getObjectType() {
return Double.class;
}
public boolean isSingleton() {
return true;
}
}
實現了FactoryBean接口的Bean,不再被視爲普通的Bean.Spring會自動檢測.
<bean id="pi" class="example.chapter3.PiFactoryBean" />
測試
public static void main(String[] args) throws Exception {

XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("pi"));//返回PiFactoryBean 的工廠方法getObject返回的Double對象實例
//PiFactoryBean p = (PiFactoryBean)factory.getBean("&pi"); //加"&"返回工廠Bean的實例.
//System.out.println(p.getObject());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章