Spring學習(十四)Spring Bean 的3種例項化方法介紹
阿新 • • 發佈:2019-01-25
Spring IoC容器如何例項化Bean呢?
傳統應用程式可以通過new和反射方式進行例項化Bean。而Spring IoC 容器則需要根據Bean定義裡的配置元資料使用反射機制來建立Bean。在Spring IoC 容器中主要有以下幾種建立Bean例項的方式:
一.構造器例項化
構造器例項化 Bean 是最簡單的方式,Spring IoC容器既能使用預設空構造器也能使用有引數構造器兩種方式建立Bean,如以下方式指定要建立的Bean型別:
1. 空構造器例項化:
2. 有引數構造器例項化:<bean id="helloServiceNoWithArgs" class="cn.lovepi.***.HelloWorldImpl" />
<bean id="helloServiceWithArgs" class=" cn.lovepi.***.HelloWorldmpl">
<!-- 指定構造器引數 -->
<constructor-arg index="0" value="Hello Spring!"/>
</bean>
接下以一個簡單的例子來介紹:
在專案中建立一個instance包,在包中建立一個HelloWorld介面:
接下來為這個介面建立一個實現類HelloWorldImpl:public interface HelloWorld { public void sayHello(); }
編寫配置檔案conf-instance.xml: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); } }
<!--使用預設構造引數-->
<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中例項化Beanpublic 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的三種方式的不同之處僅僅在於其配置檔案的格式上,其使用方式都是一樣的。