摘自:http://jinnianshilongnian.iteye.com/blog/1413857
實例化Bean
Spring IoC容器如何實例化Bean呢?傳統應用程序可以通過new和反射方式進行實例化Bean。而Spring IoC容器則需要根據Bean定義里的配置元數據使用反射機制來創建Bean。在Spring IoC容器中根據Bean定義創建Bean主要有以下幾種方式:
一、使用構造器實例化Bean:
這是最簡單的方式,Spring IoC容器即能使用默認空構造器也能使用有參數構造器兩種方式創建Bean,如以下方式指定要創建的Bean類型:
使用空構造器進行定義,使用此種方式,class屬性指定的類必須有空構造器
<bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/>
使用有參數構造器進行定義,使用此中方式,可以使用<constructor-arg>標簽指定構造器參數值,其中index表示位置,value表示常量值,也可以指定引用,指定引用使用ref來引用另一個Bean定義,后邊會詳細介紹:
<bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2">
<!-- 指定構造器參數 -->
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
二、使用靜態工廠方式實例化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="cn.javass.spring.chapter2.HelloApiStaticFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
--
@Test
public void testInstantiatingBeanByStaticFactory() {
//使用靜態工廠方法
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("chaper2/instantiatingBean.xml");
HelloApi bean3 = beanFactory.getBean("bean3", HelloApi.class);
bean3.sayHello();
}
三、使用實例工廠方法實例化Bean:
使用這種方式不能指定class屬性,此時必須使用factory-bean屬性來指定工廠Bean,factory-method屬性指定實例化Bean的方法,而且使用實例工廠方法允許指定方法參數,方式和使用構造器方式一樣,配置如下:
public class HelloApiInstanceFactory {
public HelloApi newInstance(String message) {
return new HelloImpl2(message);
}
}
--
<!—1、定義實例工廠Bean -->
<bean id="beanInstanceFactory"
class="cn.javass.spring.chapter2.HelloApiInstanceFactory"/>
<!—2、使用實例工廠Bean創建Bean -->
<bean id="bean4"
factory-bean="beanInstanceFactory"
factory-method="newInstance">
<constructor-arg index="0" value="Hello Spring!"></constructor-arg>
</bean>
小結
到此我們已經講完了Spring IoC基礎部分,包括IoC容器概念,如何實例化容器,Bean配置、命名及實例化,Bean獲取等等。不知大家是否注意到到目前為止,我們只能通過簡單的實例化Bean,沒有涉及Bean之間關系。接下來一章讓我們進入配置Bean之間關系章節,也就是依賴注入。