一、通过静态工厂方法配置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]//实例工厂方法