Spring基础15——通过工厂方法来配置bean

1、什么是工厂方法

       这里的工厂方法指的是创建指定bean的方法。工厂方法又分为静态工厂方法和实例工厂方法。

2、静态工厂方法配置bean

       调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,不需要创建工厂实例就可以返回工厂创建的对象,就叫做静态工厂,当客户端需要对象时,只需要简单的调用静态方法,而不需要关心创建对象的细节。要声明通过静态方法创建的Bean,需要在Bean的class属性指定拥有该工厂的方法的类,同时在factory-method属性里指定工厂方法的名称,最后使用<constrctor-arg>元素为该方法传递方法参数。

       首先创建一个提供静态工厂方法的类:

 1 public class StaticCarFactory {
 2     private static Map<String, Car> cars = new HashMap<String, Car>();
 3     static {
 4         cars.put("audi", new Car("audi", 300000));
 5         cars.put("ford", new Car("audi", 400000));
 6     }
 7     //静态工厂方法,根据名字获取car对象
 8     public static Car getCar(String name) {
 9         return cars.get(name);
10     }
11 }

 spring配置文件

1 <!--通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例-->
2 <!--
3     class属性:指向静态工厂的全类名
4     fatory-method:指向静态工厂方法的名字
5     constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
6  -->
7 <bean id="car1" class="com.wzy.factory.StaticCarFactory" factory-method="getCar">
8     <constructor-arg name="name" value="audi"/>
9 </bean>

编写Main测试类

1 public class Main {
2     public static void main(String[] args) {
3         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
4 
5         Car car1 = (Car) ctx.getBean("car1");
6 
7         System.out.println(car1);
8     }
9 }

输出结果:我们可以看到通过静态工厂成功创建了一个对象。

3、实例工厂方法配置bean

       使用实例工厂方法配置bean首先需要创建一个实例工厂的bean,通过调用实例工厂bean的非静态方法创建目标的bean对象,同时在factory-bean属性里指定工厂bean的id,最后使用<constrctor-arg>元素为该方法传递方法参数。

       首先创建一个实例工厂的bean:

 1 public class InstanceCarFactory {
 2     private Map<String, Car> cars = null;
 3 
 4     public InstanceCarFactory() {
 5         cars = new HashMap<String, Car>();
 6         cars.put("audi", new Car("audi", 300000));
 7         cars.put("ford", new Car("ford", 400000));
 8     }
 9 
10     public Car getCar(String name){
11         return cars.get(name);
12     }
13 
14 }

配置Spring配置文件

 1 <!--实例工厂的实例-->
 2 <!--
 3     factory-bean:指向实例工厂方法的bean
 4     fatory-method:指向实例工厂方法的名字
 5     constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数
 6  -->
 7 <bean id="instanceCarFactory" class="com.wzy.factory.InstanceCarFactory"/>
 8 <!--通过实例工厂来配置bean-->
 9 <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar">
10     <constructor-arg name="name" value="ford"/>
11 </bean>

修改Main测试类:

1 public class Main {
2     public static void main(String[] args) {
3         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-factory.xml");
4         
5         Car car2 = (Car) ctx.getBean("car2");
6 
7         System.out.println(car2);
8     }
9 }

输出结果:

猜你喜欢

转载自www.cnblogs.com/fengyun2019/p/10842078.html
今日推荐