前面几节,我们配过了好多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>