通过工厂方法配置Bean
前面几节,我们配过了好多Bean,通过反射机制,在class属性里填写全类名,现在我们来讲讲其他方式,通过工厂方法,还有通过FactoryBean,这个在我们整合第三方框架时会用到。
工厂方法可以分为静态工厂方法和实例工厂方法。
静态工厂方法
调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,而不用关心创建对象的细节。
要声明通过静态方法创建的Bean,需要在Bean的class属性里指定拥有该工厂方法的类,同时在factroy-method属性里指定工厂方法的名称,最后使用<constrctor-arg>元素为该方法传递方法参数。
做一下准备工作,创建Car.java为了方便,我们需要额外给它加一个含参的构造方法:
创建StaticCarFactory.java,所谓静态工厂方法就是直接调用某个类的静态方法就可以返回Bean实例。
-
package com.figsprite.bean.factory;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class StaticCarFactory {
-
-
-
private static Map<String,Car> cars = new HashMap<>();
-
-
-
static {
-
cars.put("奥迪",new Car("奥迪",233));
-
cars.put("宝马",new Car("宝马",666));
-
}
-
-
//静态工厂方法
-
public static Car getCar(String name){
-
return cars.get(name);
-
}
-
}
创建新的配置文件,此时,class属性只想静态工厂方法的全类名,factory-method指向静态工厂方法名,最后,如果工厂方法需要参数,通过<constructror-arg>配置参数
<bean id="car1" class="com.figsprite.bean.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg value="奥迪"/>
</bean>
接下来写一个测试方法
实例工厂方法
实例工厂指的是创建Bean之前还要实例化工厂。在调用工厂的实例方法返回bean的实例
创建一个实例工厂类:InstanceCarFactory.java
-
package com.figsprite.bean.factory;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class InstanceCarFactory {
-
private Map<String,Car> cars = null;
-
-
public InstanceCarFactory(){
-
cars = new HashMap<>();
-
cars.put("奥迪",new Car("奥迪",233));
-
cars.put("宝马",new Car("宝马",666));
-
}
-
-
-
public Car getCar(String brand){
-
return cars.get(brand);
-
}
-
}
来到配置文件,我们需要先造一个工厂bean,再通过这个bean创建car的bean
-
<bean id="carFactory" class="com.figsprite.bean.factory.InstanceCarFactory"/>
-
-
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
-
<constructor-arg value="宝马"></constructor-arg>
-
</bean>