1、静态工厂方法创建Bean
- 静态工厂方法创建Bean,是将对象的创建的过程封装到静态方法中。当客户端需要对象时,只需要简单的调用静态方法,而不关心创建对象的细节
- 要声明静态方法创建的bean,需要在bean的class属性中指定拥有该工厂的方法的类,同时在factory-method里指定工厂方法的名字,最后使用<constructor-arg>元素为该方法传递方法参数
package factory; import java.util.HashMap; import java.util.Map; /** * 静态工厂方法:直接用某一个类的静态方法就可以返回Bean的实例 * * @author chenpeng * @date 2018/6/2 13:52 */ public class StaticCarFactory { private static Map<String,Car> cars = new HashMap<String, Car>(); //静态块中进行初始化 static { cars.put("Audi",new Car("Audi", (double) 30000)); cars.put("大众",new Car("大众", (double) 20000)); } //静态工厂方法 public static Car getCar(String name){ return cars.get(name); } }
<!-- 通过静态工厂方法来配置Bean,注意不是配置静态工厂方法实例, 而是配置Bean实例 class:指向静态工厂方法的全类名 factory-method:静态工厂方法名 constructor-arg:赋值,如果工厂方法需要传入参数,则使用constructor-arg来配置参数 --> <bean id="car1" class="factory.StaticCarFactory" factory-method="getCar"> <constructor-arg value="Audi"/> </bean>
2、实例工厂方法创建Bean
- 实例工厂方法:将对象的创建过程封装在另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。- 要声明静态方法创建的bean,需要在bean的class属性中指定拥有该工厂的方法的类,同时在factory-method里指定工厂方法的名字,最后使用<constructor-arg>元素为该方法传递方法参数
package factory; import org.omg.Dynamic.Parameter; import java.util.HashMap; import java.util.Map; /** * 实例工厂方法:实例工厂的方法需要创建工厂本身,再调用工厂的实例方法来返回bean的实例 * * @author chenpeng * @date 2018/6/2 14:10 */ public class InstanceCarFactory { private Map<String,Car> cars = null; public InstanceCarFactory() { cars = new HashMap<String, Car>(); cars.put("Audi",new Car("Audi", (double) 30000)); cars.put("大众",new Car("大众", (double) 20000)); } public Car getCar(String brand){ return cars.get(brand); } }
<!--配置工厂的实例--> <bean id="carFactory" class="factory.InstanceCarFactory"/> <!-- 通过实例工厂方法来配置bean factory-bean:指向实例工厂方法的bean factory-method:静态工厂方法名 constructor-arg:赋值,如果工厂方法需要传入参数,则使用constructor-arg来配置参数 --> <bean id="car2" factory-bean="carFactory" factory-method="getCar"> <constructor-arg value="大众"/> </bean>
3、通过factoryBean返回Bean的实例
package factoryBean; import org.springframework.beans.factory.FactoryBean; /** * 通过自定义的FactoryBean,需要实现FactoryBean接口 * * @author chenpeng * @date 2018/6/2 14:37 */ public class CarFactoryBean implements FactoryBean<Car> { private String brand; public void setBrand(String brand) { this.brand = brand; } /** *返回Bean的对象 */ public Car getObject() throws Exception { return new Car(brand, (double) 30000); } /** * 返回Bean的类型 */ public Class<?> getObjectType() { return Car.class; } //是否为单实例 public boolean isSingleton() { return false; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 通过FactoryBean来配置Bean的实例 class:指向FactoryBean的全类名 property:配置FactoryBean的属性 但实际返回的却是FactoryBean的getObject()方法返回的实例 --> <bean id="facoryBean" class="factoryBean.CarFactoryBean"> <property name="brand" value="xxxx"/> </bean> </beans>