Spring中通過工廠方法配置bean
一、通過靜态工廠方法來配置bean
1、說在前面
(1)調用靜态工廠方法建立 Bean是将對象建立的過程封裝到靜态方法中。當用戶端需要對象時, 隻需要簡單地調用靜态方法, 而不同關心建立對象的細節。
(2)要聲明通過靜态方法建立的 Bean, 需要在 Bean 的 class 屬性裡指定擁有該工廠的方法的類, 同時在 factory-method 屬性裡指定工廠方法的名稱。最後,使用 <constrctor-arg> 元素為該方法傳遞方法參數。
2、執行個體示範
Car類:
package com.at.beans.factory;
public class Car {
private String brand;
private double price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}
public Car(String brand, double price) {
super();
this.brand = brand;
this.price = price;
}
}
StaticCarFactory類:
package com.at.beans.factory;
import java.util.HashMap;
import java.util.Map;
/**
* 靜态工廠方法:直接調用某一個類的靜态方法就可以傳回bean的執行個體
* @author LI AO
*
*/
public class StaticCarFactory {
private static Map<String,Car> cars = new HashMap<String, Car>();
static{
cars.put("Audi", new Car("Audi", 400000));
cars.put("Ford", new Car("Ford", 300000));
}
public static Car getCar(String name){
return cars.get(name);
}
}
配置bean:
<!-- 通過靜态工廠方法來配置bean,注意不是配置靜态工廠方法執行個體,而是配置bean的執行個體 -->
<!--
class屬性:指向靜态工廠方法的全類名
factory-method:指向靜态工廠方法的名稱
constructor-arg:如果靜态工廠方法需要傳入參數,則使用constructor-arg來配置參數
-->
<bean id="car1" class="com.at.beans.factory.StaticCarFactory" factory-method="getCar">
<constructor-arg value="Audi"></constructor-arg>
</bean>
測試函數:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
Car car1 = (Car) ctx.getBean("car1");
System.out.println(car1);
傳回結果:
六月 01, 2017 3:42:45 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
資訊: Refreshing org[email protected]7a5f39b0: startup date [Thu Jun 01 15:42:45 CST 2017]; root of context hierarchy
六月 01, 2017 3:42:45 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [beans-factory.xml]
Car [brand=Audi, price=400000.0]
二、通過執行個體工廠方法來配置bean
1、說在前面
(1)執行個體工廠方法: 将對象的建立過程封裝到另外一個對象執行個體的方法裡,當用戶端需要請求對象時,隻需要簡單的調用該執行個體方法而不需要關心對象的建立細節。
(2)要聲明通過執行個體工廠方法建立的bean:
① 在 bean 的 factory-bean 屬性裡指定擁有該工廠方法的 Bean;
② 在 factory-method 屬性裡指定該工廠方法的名稱;
③ 使用 construtor-arg 元素為工廠方法傳遞方法參數。
2、執行個體示範
Car類和靜态工廠方法中的一樣。
InstanceCarFactory類:
package com.at.beans.factory;
import java.util.HashMap;
import java.util.Map;
//執行個體工廠方法:執行個體工廠的方法:即需要先建立工廠本身,在調用工廠的執行個體方法來傳回bean的執行個體
public class InstanceCarFactory {
private Map<String, Car> cars = null;
public InstanceCarFactory(){
cars = new HashMap<String, Car>();
cars.put("Audi",new Car("Audi",400000));
cars.put("Ford",new Car("Ford",300000));
}
public Car getCar(String brand){
return cars.get(brand);
}
}
配置bean:
<!-- 配置工廠的執行個體 -->
<bean id="carFactory" class="com.at.beans.factory.InstanceCarFactory"></bean>
<!-- 通過執行個體工廠方法來配置bean -->
<!--
class屬性:指向執行個體工廠方法的bean
factory-method:指向執行個體工廠方法的名稱
constructor-arg:如果執行個體工廠方法需要傳入參數,則使用constructor-arg來配置參數
-->
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="Ford"></constructor-arg>
</bean>
測試函數
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
Car car2 = (Car) ctx.getBean("car2");
System.out.println(car2);
傳回結果:
六月 01, 2017 4:35:56 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
資訊: Refreshing org[email protected]1c49094: startup date [Thu Jun 01 16:35:56 CST 2017]; root of context hierarchy
六月 01, 2017 4:35:56 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [beans-factory.xml]
Car [brand=Ford, price=300000.0]
By luoyepiaoxue2014
微網誌位址:http://weibo.com/luoyepiaoxue2014 點選打開連結