深入學習Spring框架之五通過工廠方法建立Bean
阿新 • • 發佈:2019-02-10
前面我們介紹了,通過構造器的方式建立Bean物件,今天我們來講一下通過工廠方法來建立Bean。
有些時候,我們有必要將一些類設定為單例模式,比如說一個國家的最高領導人,再比如我們在銀行辦理業務的時候,整個業務流程中間,我們作為銀行的客戶身份必須是獨一無二,不然你的錢存到了別人賬戶裡去了,那你能幹嗎?
下面是類的具體實現:
在這裡我們運用了一種被稱為initialization on demand holder的技術來建立單例類的例項,說白了就是延遲載入單例模式。/** * 我們只希望有一個習大大,所以外面沒有其他方式建立 * 只能通過靜態工廠方法獲得,忠於習大大的領導 * @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; } }
往深一點講,這得益於Java虛擬機器初始化階段的特性,當一個類被JVM載入,這個類就會歷經初始化的過程。既然這個類沒有其他靜態的變數需要初始化,那麼初始化過程就會順利完成。而定義在類裡面的靜態類SingleToLeaderControllor直到JVM確定SingleToLeaderControllor一定會被執行的時候才會去初始化。
當靜態方法getInstance呼叫時,靜態類SingleToLeaderControllor被執行,當這件事第一次發生時,JVM這才去載入並初始化SingleToLeaderControllor
SingleToLeaderControllor的初始化導致了靜態變數instance的初始化,而內部類和外部類的初始化過程是序列操作的,而靜態變數又在類的初始化過程中被寫入,所以呼叫getInstance方法返回的是相同的instance,所以即使在並行操作環境下,也不用再考慮同步的開銷。
回到我們的主題,怎麼在Spring中通過工廠方法建立Bean呢?
<bean>元素有一個factory-method,允許我們指定一個靜態方法代替構造方法建立類的例項。
至此,我們就使用Spring的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>