1. 程式人生 > >深入學習Spring框架之五通過工廠方法建立Bean

深入學習Spring框架之五通過工廠方法建立Bean

    前面我們介紹了,通過構造器的方式建立Bean物件,今天我們來講一下通過工廠方法來建立Bean。

    有些時候,我們有必要將一些類設定為單例模式,比如說一個國家的最高領導人,再比如我們在銀行辦理業務的時候,整個業務流程中間,我們作為銀行的客戶身份必須是獨一無二,不然你的錢存到了別人賬戶裡去了,那你能幹嗎?

    下面是類的具體實現:

/**
 * 我們只希望有一個習大大,所以外面沒有其他方式建立
 * 只能通過靜態工廠方法獲得,忠於習大大的領導
 * @author liuyc
 */
public class TopLeader {
	private TopLeader(){
		
	}
	/**
	 * 內部類,延遲載入例項
	 * @author liuyc
	 */
	private static class SingleToLeaderControllor{
		static final TopLeader instance = new TopLeader();
	}
	
	public static TopLeader getInstance(){
		return SingleToLeaderControllor.instance;
	}
}
    在這裡我們運用了一種被稱為initialization on demand holder的技術來建立單例類的例項,說白了就是延遲載入單例模式。

    往深一點講,這得益於Java虛擬機器初始化階段的特性,當一個類被JVM載入,這個類就會歷經初始化的過程。既然這個類沒有其他靜態的變數需要初始化,那麼初始化過程就會順利完成。而定義在類裡面的靜態類SingleToLeaderControllor直到JVM確定SingleToLeaderControllor一定會被執行的時候才會去初始化。

    當靜態方法getInstance呼叫時,靜態類SingleToLeaderControllor被執行,當這件事第一次發生時,JVM這才去載入並初始化SingleToLeaderControllor 

    SingleToLeaderControllor的初始化導致了靜態變數instance的初始化,而內部類和外部類的初始化過程是序列操作的,而靜態變數又在類的初始化過程中被寫入,所以呼叫getInstance方法返回的是相同的instance,所以即使在並行操作環境下,也不用再考慮同步的開銷。

    回到我們的主題,怎麼在Spring中通過工廠方法建立Bean呢?

    <bean>元素有一個factory-method,允許我們指定一個靜態方法代替構造方法建立類的例項。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<bean id="leader"  class ="com.cm2easy.miki.example.chapter1.TopLeader" factory-method="getInstance"></bean>
</beans>
    至此,我們就使用Spring的factory-method方法配置了一個單例類的例項