Spring創建Bean的三種方式

一、 使用構造器創建Bean的實例
在依賴注入已經敘述多種注入實例

二、使用靜態工廠方法創建Bean
實例如下:

**靜態工廠方法所產生的產品是該接口的實例**
package com.home.bean;
/**
 * 定義Beging接口,靜態工廠方法所產生的產品是該接口的實例
 */
public interface Being {
    public void testBeing();
}

**下面爲兩個實現類,靜態工廠將會產生這兩個實現類的實例**
package com.home.bean;

public class Dog implements Being{
    private String msg;
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public void testBeing() {
        // TODO Auto-generated method stub
    System.out.println(msg+",狗吃骨頭");
    }
}

package com.home.bean;

public class Cat implements Being{
    private String msg;
    public void setMsg(String msg) {
        this.msg = msg;
    }

    public void testBeing() {
        // TODO Auto-generated method stub
        System.out.println(msg+",貓愛吃魚");
    }

}

下面是工廠類,該靜態方法getBeing()用於返回一個Being的實例
package com.home.bean;

public class BeingFactory {
    //返回Beging實例的靜態工廠方法
    //type參數決定返回哪一個Beging類的實例
    public static Being getBeing(String type){
        //調用此靜態方法的參數爲dog,則返回Dog的實例
        if(type.equalsIgnoreCase("dog")){
            return new Dog();
        }else{
            return new Cat();
        }
    }
}
配置文件:
 <!-- 下面配置驅動Spring調用beingFactory的靜態方法getBeging方法來創建bean
           該bean元素包含constructor-arg元素用於靜態工廠方法的參數
     -->
     <!-- 1、class屬性值不再是bean實例的實現類
          2、constructor-arg元素用於靜態工廠方法的參數
          3、使用factory-method屬性指定創建bean實例的靜態工廠方法
      -->
     <bean id="dog" class="com.home.bean.BeingFactory" factory-method="getBeing">
        <!-- 配置靜態工廠方法的參數 -->
        <constructor-arg value="dog" />
        <property name="msg" value="我是狗"/>
     </bean>
      <bean id="cat" class="com.home.bean.BeingFactory" factory-method="getBeing">
        <!-- 配置靜態工廠方法的參數 -->
        <constructor-arg value="cat" />
        <property name="msg" value="我是貓"/>
     </bean>
測試類如下:
package spring;

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

import com.home.bean.Being;

public class springTest2 {
    public static void main(String[] args) {
         ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
         Being b1=ctx.getBean("dog", Being.class);
         Being b2=ctx.getBean("cat", Being.class);
         b1.testBeing();
         b2.testBeing();
         /**
          * 我是狗,狗吃骨頭
                              我是貓,貓愛吃魚
          */
    }
}

三、調用實例工廠方法創建bean
區別:
調用靜態工廠類只需要使用工廠類即可,而調用實例工廠方法則需要工廠實例。配置靜態工廠方法使用class指定靜態工廠類,而配置實例工廠方法則使用factory-bean指定工廠實例。
實例如下:

package com.home.bean;
//實例工廠方法所產生的對象將實現此接口
public interface People {
    public String sayHello(String name);
    public String sayGoodBye(String name);
}

兩個實現類:
package com.home.bean;

public class Chinese implements People{
    public String sayHello(String name) {
        // TODO Auto-generated method stub
        return name+",你好!";
    }
    public String sayGoodBye(String name) {
        // TODO Auto-generated method stub
        return name+",再見!";
    }

}

package com.home.bean;

public class American implements People{

    public String sayHello(String name) {
        // TODO Auto-generated method stub
        return name+",Hello!";
    }

    public String sayGoodBye(String name) {
        // TODO Auto-generated method stub
        return name+",Good Bye!";
    }

}

實例工廠類如下:
負責生產People對象的實例工廠
package com.home.bean;
public class PersonFactory {
    //獲得People的實例工廠方法
    public People getPerson(String type){
        if(type.equals("chin")){
            return new Chinese();
        }else{
            return new American();
        }
    }
}

配置文件如下:
<!-- 配置實例化工廠 -->
    <!--配置工廠bean,該bean負責產生其他bean的實例  -->
    <bean id="personFactory" class="com.home.bean.PersonFactory"></bean>
    <!--  下面配置驅動Spring調用getPerson方法來創建bean-->
    <bean id="chinese" factory-bean="personFactory" factory-method="getPerson">
      <constructor-arg value="chin" />
    </bean>
     <bean id="american" factory-bean="personFactory" factory-method="getPerson">
      <constructor-arg value="ame" />
    </bean>
測試類如下:
package spring;

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

import com.home.bean.People;
public class springTest3 {
    public static void main(String[] args) {
         ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
         People p1=ctx.getBean("chinese",People.class);
         System.out.println(p1.sayHello("中國人"));;
         People p2=ctx.getBean("american",People.class);
         System.out.println(p2.sayHello("American"));
         /**print:
          * 中國人,你好!
            American,Hello!
          */
    }
}
發佈了91 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章