Spring學習(十四)Spring Bean 的3種實例化方法介紹

Spring IoC容器如何實例化Bean呢?

傳統應用程序可以通過new反射方式進行實例化Bean。而Spring IoC 容器則需要根據Bean定義裏的配置元數據使用反射機制來創建Bean。在Spring IoC 容器中主要有以下幾種創建Bean實例的方式:

一.構造器實例化
構造器實例化 Bean 是最簡單的方式,Spring IoC容器既能使用默認空構造器也能使用有參數構造器兩種方式創建Bean,如以下方式指定要創建的Bean類型:

1. 空構造器實例化:

<bean id="helloServiceNoWithArgs" class="cn.lovepi.***.HelloWorldImpl" />
2. 有參數構造器實例化:

<bean id="helloServiceWithArgs" class=" cn.lovepi.***.HelloWorldmpl">
    <!-- 指定構造器參數 -->
    <constructor-arg index="0" value="Hello Spring!"/>
</bean>
接下以一個簡單的例子來介紹:
在項目中創建一個instance包,在包中創建一個HelloWorld接口:
public interface HelloWorld {
    public  void sayHello();
}
接下來爲這個接口創建一個實現類HelloWorldImpl:

public class HelloWorldImpl implements HelloWorld{
    private String message;

    /**
    * 空構造器
    */
    HelloWorldImpl(){
        message="Hello World";
    }

    /**
    * 帶參數的構造器
    * @param message
    */
    HelloWorldImpl(String message){
        this.message=message;
    }
    public void sayHello() {
        System.out.println(message);
    }
}
編寫配置文件conf-instance.xml:
<!--使用默認構造參數-->
<bean id="helloWorldWithNoArgs"
class="cn.lovepi.chapter03.instance.HelloWorldImpl" />

<!--使用有參數構造參數-->
<bean id="helloWorldWithArgs"
class="cn.lovepi.chapter03.instance.HelloWorldImpl" >
    <!-- 指定構造器參數 -->
    <constructor-arg index="0" value="Hello Args!"/>
</bean>
接下來創建Main.java,作爲程序入口
/**
* 使用無參數的構造函數來實例化bean
*/
public static void sayHelloWordWithNoArgs(){
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");
    HelloWorld helloWorld=factory.getBean("helloWorldWithNoArgs",HelloWorldImpl.class);
    helloWorld.sayHello();
}

/**
* 使用有參數的構造函數來實例化bean
*/
public static void sayHelloWorldWithArgs(){
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");
    HelloWorld helloWorld=factory.getBean("helloWorldWithArgs",HelloWorldImpl.class);
    helloWorld.sayHello();
}
二.使用靜態工廠來實例化Bean
使用靜態工廠的方式除了指定必須的class屬性,還要指定factory-method屬性來指定實例化Bean的方法,而且使用靜態工廠方法也允許指定方法參數,Spring IoC容器將調用此屬性指定的方法來獲取Bean,配置如下:
<!--使用有參數構造參數-->
<bean id="helloServiceStaticFactory"  class="cn.lovepi.***.HelloWorldStaticFactory"
factory-method="newInstance">
     <!-- 指定構造器參數 -->
     <constructor-arg index="0" value="Hello Static Factory!"/>
</bean>
接下來我們在項目中實現:
首先編寫靜態工廠方法類HelloWorldStaticFactory
public class HelloWorldStaticFactory {
    /**
    * 工廠方法
    * @param message
    * @return
    */
    public static HelloWorld newInstance(String message){
        //返回帶參數的HelloWorldImpl構造的helloWorld實例
        return new HelloWorldImpl(message);
    }
}
接下來在配置文件中來配置當前bean

<!--靜態工廠方式-->
<bean id="helloWorldStaticFactory"
class="cn.lovepi.chapter03.instance.HelloWorldStaticFactory"
factory-method="newInstance" >
    <!-- 指定構造器參數 -->
    <constructor-arg index="0" value="Hello Static Factory!"/>
</bean>
在Main中實例化Bean
public static void sayHelloWordStaticFactory(){
    //讀取配置文件,實例化一個IoC容器
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");
    //從容器中獲取bean,注意此處完全“面向接口編程而不是面向實現”
    HelloWorld helloWorld=factory.getBean("helloWorldStaticFactory",HelloWorld.class);
    //執行業務邏輯
    helloWorld.sayHello();
}
三.使用實例工廠來實例化bean
使用實例工廠方式不能指定class屬性,此時必須使用factory-bean屬性來指定工廠Bean,factory-method屬性指定實例化Bean的方法,而且使用實例工廠方法允許指定方法參數,方式和使用構造器方式一樣,配置如下:
<!-- 1、定義實例工廠Bean -->
<bean id="beanInstanceFactory" class="cn.lovepi.***.HelloWorldInstanceFactory" />
<!-- 2、使用實例工廠Bean創建Bean -->
    <bean id=“helloWorldInstance" factory-bean="beanInstanceFactory"
                              factory-method="newInstance">
         <constructor-arg index="0" value="Hello  Instance Factory!"></constructor-arg>
    </bean>
接下來在項目中實現
首先我們編寫實例化工廠方法HelloWorldInstanceFactory
public class HelloWorldInstanceFactory {
    /**
    * 工廠方法
    * @param message
    * @return
    */
    public HelloWorld newInstance(String message){
        //需要返回的bean實例
        return new HelloWorldImpl(message);
    }
}
在配置文件中配置相關屬性:
<!-- 1、定義實例工廠Bean -->
<bean id="helloWorldInstanceFactory"
class="cn.lovepi.chapter03.instance.HelloWorldInstanceFactory" />
<!-- 2、使用實例工廠Bean創建Bean -->
<bean id="helloWorldInstance"
      factory-bean="helloWorldInstanceFactory"
      factory-method="newInstance">
    <constructor-arg index="0"
                      value="Hello Instance Factory!">

    </constructor-arg>
</bean>
在Main中實例化Bean
public static void sayHelloWorldInstanceFactory(){
    //讀取配置文件,實例化一個IoC容器
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-instance.xml");
    //從容器中獲取bean,注意此處完全“面向接口編程而不是面向實現”
    HelloWorld helloWorld=factory.getBean("helloWorldInstance",HelloWorld.class);
    //執行業務邏輯
    helloWorld.sayHello();
}
總結:
實例化Bean的三種方式的不同之處僅僅在於其配置文件的格式上,其使用方式都是一樣的。










發佈了68 篇原創文章 · 獲贊 132 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章