spring04-----Ioc容器實例化Bean

Spring IoC容器如何實例化Bean呢?傳統應用程序能夠經過new和反射方式進行實例化Bean。而Spring IoC容器則需 要根據Bean定義裏的配置元數據使用反射機制來建立Bean。在Spring IoC容器中根據Bean定義建立Bean主要有如下 幾種方式:java

一. 使用構造器實例化Bean

這是最簡單的方式,Spring IoC容器即能使用默認空構造器也能使用有參數構造器兩種方 式建立Bean,如如下方式指定要建立的Bean類型:spring

1. 使用空構造器進行定義,使用此種方式,class屬性指定的類必須有空構造器。函數

 <bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/>

2. 使用有參數構造器進行定義,使用這種方式,能夠經過< constructor-arg >標籤指定構造器參數值,其中index表示位 置,value表示常量值,也能夠指定引用,指定引用使用ref來引用另外一個Bean定義,後邊會詳細介紹:測試

 <bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2">
      <!-- 指定構造器參數 --> 
     <constructor-arg index="0" value="Hello Spring!"/> 
</bean

知道如何配置了,下面介紹一個例子來實踐一下:this

(1)準備Bean class(HelloImpl2.java),該類有一個空構造器和一個有參構造器。spa

public interface HelloApi {
    public void sayHello();

}

public class HelloImpl2 implements HelloApi{
    private String message;
    public HelloImpl2() {
        this.message="Hello World";
    }
    public HelloImpl2(String message) {
        this.message=message;
    }
    public void sayHello() {
        System.out.println(message);
    }
    

}

(2)準備配置文件(resources/bean.xml)code

    <!-- 使用默認構造函數 -->
    <bean id="bean1" class="com.test.spring.HelloImpl2">
    </bean>
    
    <!-- 使用有參構造函數 -->
    <bean id="bean2"  class="com.test.spring.HelloImpl2">
        <constructor-arg index="0" value="Hello Spring"/>
    </bean>    

(3)實例化對象進行測試xml

public class HelloTest {
    public static void main(String args[]) {
        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        HelloImpl2 aHelloImpl2=(HelloImpl2) context.getBean("bean1");
        HelloImpl2 bHelloImpl2=(HelloImpl2) context.getBean("bean2");
        aHelloImpl2.sayHello();
        bHelloImpl2.sayHello();
    }
        
}


Hello World
Hello Spring

二. 使用靜態工廠方式實例化Bean

使用這種方式除了指定必須的class屬性,還要指定factory-method屬性來指定實 例化Bean的方法,並且使用靜態工廠方法也容許指定方法參數,spring IoC容器將調用此屬性指定的方法來獲取 Bean,配置以下所示:對象

public class HelloApiStaticFactory {
    //工廠方法
    public static HelloApi newInstance(String message) {
        //返回須要的Bean實例
        return new HelloImpl2(message);
    }

}


<bean id="bean3" class="com.test.spring.HelloApiStaticFactory" factory-method="newInstance">
        <constructor-arg index="0" value="Hello Spring"/>
    </bean>


public class HelloTest {
    public static void main(String args[]) {
        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        HelloImpl2 aHelloImpl2=(HelloImpl2) context.getBean("bean3");
        aHelloImpl2.sayHello();
    }
        
}

Hello Spring

三. 使用實例工廠方法實例化Bean

此時必須使用factory-bean屬性來指定工廠 Bean,factory-method屬性指定實例化Bean的方法,並且使用實例工廠方法容許指定方法參數,方式和使用構造器方 式同樣,配置以下:blog

public class HelloApiInstanceFactory {
    public HelloApi newInstance(String message) {
        return new HelloImpl2(message);
    }

}


    <!-- 1.定義實例工廠Bean -->
    <bean id="beanInstanceFactory" class="com.test.spring.HelloApiInstanceFactory"/>
    
    <!-- 2.使用實例工廠Bean建立Bean -->
    <bean id="bean4" factory-bean="beanInstanceFactory" factory-method="newInstance">
        <constructor-arg index="0" value="Hello Spring"></constructor-arg>
    </bean>

public class HelloTest {
    public static void main(String args[]) {
        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        HelloImpl2 aHelloImpl2=(HelloImpl2) context.getBean("bean4");
        aHelloImpl2.sayHello();
    }
        
}

Hello Spring

 

這三種方式只是配置不同,從獲取方 式看徹底同樣,沒有任何不一樣。這也是Spring IoC的魅力,Spring IoC幫你建立Bean,咱們只管使用就能夠了,是否是 很簡單。

 

參考文獻:

http://jinnianshilongnian.iteye.com

相關文章
相關標籤/搜索