1. 程式人生 > >Spring學習(十四)Spring Bean 的3種例項化方法介紹

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的三種方式的不同之處僅僅在於其配置檔案的格式上,其使用方式都是一樣的。