一、通過靜態工廠方法配置bean
<!--
通過靜態工廠方法配置bean,注意不是配置靜態工廠方法實例,而是配置bean實例
class屬性:指向靜態工廠方法的全類名
factory-method:指向靜態工廠方法的名字
constructor-arg:如果工廠方法需要傳入參數,則使用constructor-arg配置參數
-->
<bean id="car" class="com.lh.factorybean.config.StaticCarFactory" factory-method="createCar">
<constructor-arg><value>ford</value></constructor-arg>
</bean>
package com.lh.factorybean.config;
import java.util.HashMap;
import java.util.Map;
import com.lh.factorybean.bean.Car;
/**
* @ClassName: StaticCarFactory
* @Description: Car靜態工廠類,直接調用某一個類的靜態方法就可以返回bean的實例
* @author Liu
* @date 2018年6月1日 下午10:12:08
*/
public class StaticCarFactory {
private static Map<String, Car> map = new HashMap<>();
static {
map.put("audi",new Car("Audi", 300000.0));
map.put("ford",new Car("Ford", 400000.0));
}
//靜態工廠方法
public static Car createCar(String name) {
return map.get(name);
}
}
package com.lh.factorybean.bean;
/**
* @ClassName: Car
* @Description: Car定義
* @author Liu
* @date 2018年6月1日 下午9:22:17
*/
public class Car {
private String brand;
private Double price;
public Car() {
super();
}
public Car(String brand, Double price) {
this.brand = brand;
this.price = price;
}
public void setBrand(String brand) {
this.brand = brand;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}
}
二、通過實例工廠方法配置bean
package com.lh.factorybean.config;
import java.util.HashMap;
import java.util.Map;
import com.lh.factorybean.bean.Car;
/**
* @ClassName: InstanceCarFactory
* @Description: 實例工廠的方法創建bean,即先需要創建工廠本身,再調用工廠的實例方法返回bean的實例
* @author Liu
* @date 2018年6月1日 下午10:31:45
*/
public class InstanceCarFactory {
private Map<String, Car> map = null;
public InstanceCarFactory() {
map = new HashMap<>();
map.put("audi", new Car("Audi", 300000.0));
map.put("ford", new Car("Ford", 400000.0));
}
public Car createCar(String name) {
return map.get(name);
}
}
<!-- 配置工廠的實例 -->
<bean id="carFactory" class="com.lh.factorybean.config.InstanceCarFactory"/>
<!-- 通過實例工廠方法來配置bean -->
<!--
通過靜態工廠方法配置bean,注意不是配置靜態工廠方法實例,而是配置bean實例
factory-bean屬性:指向實例工廠方法的bean引用
factory-method:指向實例工廠方法的名字
constructor-arg:如果工廠方法需要傳入參數,則使用constructor-arg配置參數
-->
<bean id="car2" factory-bean="carFactory" factory-method="createCar">
<constructor-arg><value>audi</value></constructor-arg>
</bean>
三、輸出
package com.lh.factorybean;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @ClassName: Main
* @Description: TODO
* @author Liu
* @date 2018年6月1日 下午9:30:37
*/
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factorybean.xml");
System.out.println(ctx.getBean("car"));
System.out.println(ctx.getBean("car2"));
ctx.close();
}
}
Car [brand=Ford, price=400000.0]//靜態工廠方法
Car [brand=Audi, price=300000.0]//實例工廠方法