1. 程式人生 > >Spring(十三):使用工廠方法來配置Bean的兩種方式(靜態工廠方法&實例工廠方法)

Spring(十三):使用工廠方法來配置Bean的兩種方式(靜態工廠方法&實例工廠方法)

color 示例 簡單的 rgs icc tostring pac ng- clas

通過調用靜態工廠方法創建Bean

1)調用靜態工廠方法創建Bean是將對象創建的過程封裝到靜態方法中。當客戶端需要對象時,只需要簡單地調用靜態方法,而不需要關心創建對象的具體細節。

2)要聲明通過靜態方法創建的Bean,需要在Bean的class屬性中指定擁有該工廠的方法的類,同時需要在bean的factory-method屬性裏指定工廠方法的名稱。最後,使用<constructor-arg>元素為該方法傳遞方法參數。

示例:

第一步:創建一個java project,導入包:

技術分享圖片

第二步:創建com.dx.spring.beans.factory.Car.java,com.dx.spring.beans.factory.StaticCarFactory.java,bean-factory.xml:

Car.java

技術分享圖片
package com.dx.spring.beans.factory;

public class Car {
    private String brand;
    private double price;
    
    public Car() {
    }
        
    public Car(String brand, double price) {
        super();
        this.brand = brand;
        this.price = 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 + "]"; } }
View Code

StaticCarFactory.java

package com.dx.spring.beans.factory;

import java.util.HashMap;
import java.util.Map;

public class StaticCarFactory {
    private static Map<String, Car> cars = null;
    static {
        cars = new HashMap<>();
        cars.put("audi", new Car("AUDI", 350000));
        cars.put("ford", new Car("FORD", 200000));
    }

    public static Car getCar(String key) {
        return cars.get(key);
    }
}

bean-factory.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="car1" class="com.dx.spring.beans.factory.StaticCarFactory"
        factory-method="getCar">
        <constructor-arg name="key" value="audi"></constructor-arg>
    </bean>
</beans>

第三步:添加Client.java測試類,並執行測試:

package com.dx.spring.beans.factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");
        Car car1 = (Car) ctx.getBean("car1");
        System.out.println(car1);
    }
}

發現執行結果成功返回car1:

Car [brand=AUDI, price=350000.0]

通過調用實例工廠方法創建Bean

1)實例工行方法:將對象的創建過程封裝到另外一個對象實例的方法裏,當客戶端需要請求對象時,只需要簡單的調用該實例方法而不需要關心對象的創建細節。

2)需要聲明通過實例工廠方法創建的Bean:

---- 在bean的factory-bean屬性裏指定擁有該工廠方法的Bean;

---- 在factory-method屬性裏指定該工廠方法的名稱;

---- 使用<constructor-arg>元素為工廠方法傳遞方法參數。

示例:(備註:基於上邊的示例修改)

第一步:創建com.dx.spring.beans.factory.InstanceCarFactory.java

package com.dx.spring.beans.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("audi", new Car("audi", 350000));
        cars.put("ford", new Car("ford", 200000));
    }

    public Car getCar(String key) {
        return cars.get(key);
    }
}

第二步:在bean-factory.xml(spring bean配置文件)中添加如下配置:

    <bean id="instanceCarFactory" class="com.dx.spring.beans.factory.InstanceCarFactory"></bean>
    <bean id="car2" factory-bean="instanceCarFactory" factory-method="getCar">
        <constructor-arg name="key" value="ford"></constructor-arg>
    </bean>

第三步:修改Client.java,添加car2測試:

package com.dx.spring.beans.factory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");
        Car car1 = (Car) ctx.getBean("car1");
        System.out.println(car1);
        
        Car car2 = (Car) ctx.getBean("car2");
        System.out.println(car2);
    }
}

測試結果為:

Car [brand=AUDI, price=350000.0]
Car [brand=ford, price=200000.0]

Spring(十三):使用工廠方法來配置Bean的兩種方式(靜態工廠方法&實例工廠方法)