Spring學習之實例化bean的三種方式


概述

學習一下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>
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM