概述
學習一下Spring IOC bean的三種實例化方式。
默認構造方法實例化bean
最常用的初始化bean
方式, 必須提供默認構造方法
public class Person {
private String name;
private Integer age;
public Person() {
System.out.println("這是一個無參構造函數");
}
public Person(String name) {
this.name = name;
System.out.println(name+"參數的構造函數");
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
System.out.println("帶有名字="+name+"和年齡="+age+"參數的構造函數");
}
}
bean.xml
<bean id="person" class="com.maple.Person"></bean>
<bean id="personWithParam" class="com.maple.Person">
<constructor-arg name="name" value="楓葉"/>
</bean>
<bean id="personWirhParams" class="com.maple.Person">
<constructor-arg name="name" value="楓葉"/>
<constructor-arg name="age" value="23"/>
</bean>
靜態工廠初始化bean
當采用靜態工廠方法創建bean時,除了需要指定class屬性外,還需要通過factory-method
屬性來指定創建bean
實例的工廠方法。Spring將調用此方法返回實例對象,就此而言,跟通過普通構造器創建類實例沒什么兩樣。
public class MyBeanFactory {
/**
* 創建實例
* @return
*/
public static UserService createService(){
return new UserServiceImpl();
}
public static UserService createService(String name){
return new UserServiceImpl(name);
}
public static UserService createService(String name,int age){
return new UserServiceImpl(name,age);
}
}
bean.xml
<bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService"></bean>
<bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService">
<constructor-arg name="name" value="楓葉"/>
</bean>
<bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService">
<constructor-arg name="name" value="楓葉"/>
<constructor-arg name="age" value="23"/>
</bean>
實例工廠初始化bean
與使用靜態工廠方法實例化類似,用來進行實例化的非靜態實例工廠方法位於另外一個bean中(即下面的MyBeanFactory .java),容器將調用該bean的工廠方法來創建一個新的bean實例。
為使用此機制,class屬性必須為空,而factory-bean 屬性必須指定為當前(或其祖先)容器中包含工廠方法的bean的名稱,而該工廠bean的工廠方法本身必須通過factory-method屬性來設定。
必須先有工廠實例對象,通過實例對象創建對象。提供所有的方法都是“非靜態”的。
/**
* 實例工廠,所有方法非靜態
*
*/
public class MyBeanFactory {
/**
* 實例化工廠
*/
public UserService createService(){
return new UserServiceImpl();
}
/**
* 實例化工廠1
*/
public static UserService createService(String name){
return new UserServiceImpl(name);
}
/**
* 實例化工廠2
*/
public static UserService createService(String name,int age){
return new UserServiceImpl(name,age);
}
}
bean.xml
<!-- 創建工廠實例 -->
<bean id="myBeanFactoryId" class="com.maple.MyBeanFactory"></bean>
<!-- 獲得userservice
* factory-bean 確定工廠實例
* factory-method 確定普通方法
-->
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">
<constructor-arg name="name" value="楓葉"/>
</bean>
<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">
<constructor-arg name="name" value="楓葉"/>
<constructor-arg name="age" value="23"/>
</bean>