?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
你也許需要許多相似的代理定義,特別是定義事務(wù)性代理的時候。使用父子bean定義,以及內(nèi)部bean定義,可以讓代理定義大大得到極大的簡化。
首先從父bean開始,為代理bean創(chuàng)建bean定義模版:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
這個bean本身將永遠不會被初始化,所以實際上是不完整的。而后每個需要創(chuàng)建的代理都是這個bean定義的子bean定義,它們把代理的目標類包裝為一個內(nèi)部bean定義,因為目標對象本身將不會被單獨使用。
<bean id="myService" parent="txProxyTemplate"> <property name="target"> <bean class="org.springframework.samples.MyServiceImpl"> </bean> </property> </bean>
當然你可以覆蓋從模版中繼承的屬性,例如在下面這個例子里的事務(wù)傳播設(shè)置:
<bean id="mySpecialService" parent="txProxyTemplate"> <property name="target"> <bean class="org.springframework.samples.MySpecialServiceImpl"> </bean> </property> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="store*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
要注意上面例子中我們已經(jīng)明確地通過設(shè)定abstract屬性把父bean定義標注為abstract,在前面的章節(jié)里有描述,這樣它實際上不能被初始化。 缺省情況下應(yīng)用程序上下文(不僅僅是bean工廠)將預先初始化所有的實例為單例。 因此下面這點是很重要的(至少對于單例bean來說),如果你有一個(父)bean定義你希望僅僅作為模版使用,而這個定義說明了一個類,你必須把abstract參數(shù)設(shè)置為true,否則應(yīng)用程序上下文將試圖預先初始化它。