通过工厂方法配置Bean

    前面几节,我们配过了好多Bean,通过反射机制,在class属性里填写全类名,现在我们来讲讲其他方式,通过工厂方法,还有通过FactoryBean,这个在我们整合第三方框架时会用到。

    工厂方法可以分为静态工厂方法和实例工厂方法。

静态工厂方法

    调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,而不用关心创建对象的细节。

    要声明通过静态方法创建的Bean,需要在Bean的class属性里指定拥有该工厂方法的类,同时在factroy-method属性里指定工厂方法的名称,最后使用<constrctor-arg>元素为该方法传递方法参数。

    做一下准备工作,创建Car.java为了方便,我们需要额外给它加一个含参的构造方法:

    创建StaticCarFactory.java,所谓静态工厂方法就是直接调用某个类的静态方法就可以返回Bean实例。

  1. package com.figsprite.bean.factory;  
  2.     
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.     
  6. public class StaticCarFactory {  
  7.     
  8.     
  9.     private static Map<String,Car> cars = new HashMap<>();  
  10.     
  11.     
  12.     static {  
  13.         cars.put("奥迪",new Car("奥迪",233));  
  14.         cars.put("宝马",new Car("宝马",666));  
  15.     }  
  16.     
  17.     //静态工厂方法  
  18.     public static Car getCar(String name){  
  19.         return cars.get(name);  
  20.     }  
  21. }  

    创建新的配置文件,此时,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

  1. package com.figsprite.bean.factory;  
  2.     
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.     
  6. public class InstanceCarFactory {  
  7.     private Map<String,Car> cars = null;  
  8.     
  9.     public InstanceCarFactory(){  
  10.         cars = new HashMap<>();  
  11.         cars.put("奥迪",new Car("奥迪",233));  
  12.         cars.put("宝马",new Car("宝马",666));  
  13.     }  
  14.     
  15.     
  16.     public Car getCar(String brand){  
  17.         return cars.get(brand);  
  18.     }  
  19. }  

来到配置文件,我们需要先造一个工厂bean,再通过这个bean创建car的bean

  1. <bean id="carFactory" class="com.figsprite.bean.factory.InstanceCarFactory"/>  
  2.     
  3. <bean id="car2" factory-bean="carFactory" factory-method="getCar">  
  4.     <constructor-arg value="宝马"></constructor-arg>  
  5. </bean>  

原文地址:https://www.cnblogs.com/figsprite/p/10776190.html