Spring筆記(三):通過工廠方法配置bean

之前筆記一實踐的是全類名(反射)的方式進(jìn)行bean的配置,現(xiàn)在我們實踐使用工廠的方法進(jìn)行bean的配置。
在使用工廠方法配置bean是有兩種方式:靜態(tài)工廠方法和實例工廠方法。

  • 靜態(tài)工廠方法
    也就是通過工廠類直接調(diào)用獲取實例的方法去獲取bean的實例,那么工廠類是如何實現(xiàn)bean的實例和初始化呢,我們在創(chuàng)建工廠類是,可以在類的靜態(tài)代碼塊中進(jìn)行bean的實例加初始化,并提供獲取bean的方法;具體代碼實現(xiàn)如下:
    創(chuàng)建Car類:
public class Car {
    private String brand;//品牌
    private double price;//價錢
    public Car() {
        System.out.println("constructor()......");
    }
    public Car(String brand, double price) {
        this.brand = brand;
        this.price = price;
    }
    public void init() {
        System.out.println("init()......");
    }

    public void destory() {
        System.out.println("destory()......");
    }
    public String getBrand() {
        return brand;
    }
   public void setBrand(String brand) {
        System.out.println("setBrand()......");
        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 +
                '}';
    }
}

靜態(tài)工廠代碼:

/**
 * 工廠靜態(tài)方法配置bean
 */
public class StaticCarFactory {
    private static Map<String, Car> cars=null;
    //初始化對象
    static {
        cars=new HashMap<>();
        cars.put("Audi",new Car("Audi",30000));
        cars.put("Ford",new Car("Ford",20000));
    }
    //獲取bean實例的方法
    public static Car getCar(String bread){
        return cars.get(bread);
    }
}

在xml配置文件中進(jìn)行靜態(tài)工廠的配置

  <!--靜態(tài)方法實現(xiàn)bean的配置-->
    <!--factory-method指向靜態(tài)工廠方法的名稱-->
    <!--constructor-arg 涉及到獲取實例方法傳參的問題,設(shè)置方法的形參-->
    <bean id="staticfactory" class="com.example.demo.factory.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="Audi"></constructor-arg>
    </bean>

根據(jù)配置文件可以看出通過靜態(tài)工廠實例去調(diào)用工廠方法去獲取bean的實例對象,具體配置涉及到的屬性如下:

  1. id 定義靜態(tài)工廠的名稱
  2. class 靜態(tài)工廠所對應(yīng)的全路徑
  3. factory-method 靜態(tài)工廠獲取bean實例的方法
  4. constructor-arg 設(shè)置調(diào)用靜態(tài)工廠獲取bean方法是需要用到的參數(shù)

測試配置:

public class FactoryMain {

    public static void main(String[] args){
        ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
        //靜態(tài)工廠配置
        Car staticfactoryCar= (Car) ctx.getBean("staticfactory");
        System.out.println(staticfactoryCar);
    }
}

運行代碼結(jié)果:

Car{brand='Audi', price=30000.0}

  • 實例工廠方法
    實例工廠
/**
 * 實例工廠配置bean
 */
public class InstanceCarFactory {
    private Map<String, Car> cars = null;

    //通過無參構(gòu)造方法初始化
    public InstanceCarFactory() {
        cars = new HashMap<>();
        cars.put("Audi", new Car("Audi", 30000));
        cars.put("Ford", new Car("Ford", 20000));
    }
    //獲取bean的方法
    public Car getCar(String bread) {
        return cars.get(bread);
    }
}

xml配置文件

 <!--配置工廠實例-->
    <bean id="instancefactory" class="com.example.demo.factory.InstanceCarFactory">
    </bean>
    <!--factory-bean 指向?qū)嵗S方法的bean-->
    <!--factory-method指向是實例工廠方法的名稱-->
    <bean id="carinstance"  factory-bean="instancefactory" factory-method="getCar">
        <constructor-arg value="Audi"></constructor-arg>
    </bean>

涉及到的屬性和靜態(tài)配置的都一樣,唯一區(qū)別就是actory-bean屬性,實例工廠配置也就是先獲取實例工廠的對象實例,這是在獲取實例工廠是調(diào)用了InstanceCarFactory()構(gòu)造方法,在構(gòu)造方法中初始化了Cars,與此同時可以調(diào)用實例工廠方法去獲取配置bean的具體實例信息。
測試代碼:

 public static void main(String[] args){
        ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
        //實例工廠配置
        Car instanceCar= (Car) ctx.getBean("carinstance");
        System.out.println(instanceCar);
    }

測試結(jié)果:

Car{brand='Audi', price=30000.0}

總結(jié):對于工廠配置bean的不論是針對靜態(tài)的方式還是實例的方式,都是在工廠中將bean實例化然后放置在ioc容器中,通過工廠獲取實例的方法去獲??!只是在實例bean的方式上是有所差異的!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容