1. 程式人生 > >Spring入門學習(工廠方法配置Bean) 第十節

Spring入門學習(工廠方法配置Bean) 第十節

Spring入門學習(工廠方法配置Bean)

配置Bean的形式

  1. 基於XML檔案的方式
  2. 基於註解的方式

Bean的配置方式

  1. 通過全類名(反射)
  2. 通過工廠方法(靜態工廠方法和例項工廠方法)
  3. FactoryBean

靜態工廠方法

靜態工廠方法建立Bean是將物件的建立過程封裝到靜態方法中,客戶端需要是隻需要簡單的呼叫就行,而不需要關心建立物件的細節
  1. 需要在Bean的class屬性中指定擁有該工廠方法的類,同時再factory-method
    屬性中指定工廠方法的名稱,使用<constructor-arg>元素設定傳入的引數。
  2. 建立一個靜態工廠類StaticCarFactory.javaCar.java
    	/**
    	 * 靜態工廠方法:直接呼叫某一個類的靜態方法就可以返回bean的例項
    	 * @author Stark
    	 *
    	 */
    public class StaticCarFactory {
    	
    	private static Map<String, Car> cars = new HashMap<String, Car>();
    	
    	static{
    		cars.put("audi"
    , new Car("audi",300000)); cars.put("ford", new Car("ford",300000)); } // 靜態工廠方法 public static Car getCar(String name){ return cars.get(name); } } public class Car { private String brand; private double price; public String getBrand() { return brand; } public void setBrand(String brand) { this
    .brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Car [brand=" + brand + ", price=" + price + "]"; } public Car(){ System.out.println("Car's constructor...."); } public Car(String brand, double price) { super(); this.brand = brand; this.price = price; } }
  3. 建立一個beans-factory.xml配置檔案
    <!-- 通過靜態工廠方法來配置bean,注意不是配置靜態工廠方法例項,而是配置bean例項 -->
    <!-- 
    	class屬性:指向靜態工廠方法的全類名 
    	factory-method: 指向靜態工廠方法的名字
    	constructor-arg: 如果工廠方法需要傳入引數,則使用constructor-arg 來配置引數
    -->
    <bean id="car1" class="com.fafa.spring.beans.factory.StaticCarFactory"
    	factory-method="getCar">
    	<constructor-arg value="audi"></constructor-arg>
    </bean>
    
  4. 建立一個Main函式進行測試:
    public class Main {
    	public static void main(String[] args) {
    		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:beans-factory.xml");
    		Car car1 = (Car) ctx.getBean("car1");
    		System.out.println(car1);
    	}
    }
    
    測試結果:
    Car [brand=audi, price=300000.0]
    顯而易見該方式是從靜態方法中獲取的值

例項工廠方法

例項工廠方法是將物件的建立過程封裝到另一個物件例項的方法裡,客戶端需要時可直接呼叫
  1. 先建立一個例項工廠類InstanceCarFactory.java
    /**
     * 例項工廠方法:例項工廠的方法,即現需要建立工廠的本身,再呼叫工廠的例項方法來返回bean的例項
     * @author Stark
     *
     */
    public class InstanceCarFactory {
    
    	private Map<String, Car> cars = null;
    	
    	public InstanceCarFactory() {
    		cars = new HashMap<String, Car>();
    		cars.put("audi", new Car("audi", 300000));
    		cars.put("ford", new Car("ford", 300000));
    	}
    	public Car getCar(String brand) {
    		return cars.get(brand);
    	}
    }
    
  2. 再在xml配置檔案中配置工廠例項
    <!-- 配置工廠的例項 -->
    <bean id="carFactory" class="com.fafa.spring.beans.factory.InstanceCarFactory"></bean>
    
  3. 建立一個bean,使用factory-bean屬性來指向工廠例項bean,factory-method指向工廠方法的名稱,constructor-arg傳入工廠方法的引數(可選)
    	<!-- 通過例項工廠的方法來配置bean -->
    	<!-- 
    		factory-bean: 指向例項工廠方法的bean
    		factory-method: 指向例項工廠方法的名字
    		constructor-arg: 如果工廠方法需要傳入引數,則使用constructor-arg 來配置引數
    	-->
    	<bean id="car2" factory-bean="carFactory" factory-method="getCar">
    		<constructor-arg value="ford"></constructor-arg>
    	</bean>
    
    測試結果:
    Car [brand=ford, price=300000.0]
    容器初始化的時候InstanceCarFactory被例項化了,因此car2在指向carFactorybean的時候直接呼叫getCar方法獲取對應的car。