必要條件:1、子bean必須與父bean保持兼容,也就是說子bean中必須有父bean定義的所有屬性。
2、父bean必須是抽象bean或者定義lazy-init=true也就是不讓bean工廠實例化該bean
注:好多人將parent指向的類說是子類繼承了父類,其實說法不正確,正確的說法應該是子bean父bean而不是子類父類,因為如果子bean指定的類已經繼承了其他的類,那么在這里一樣可以有一個父bean,(如果真像大家說的那樣那不成多重繼承了嗎)
1、如果父bean有class屬性,而子bean沒有,那么子bean的class就和父bean相同 例如:
1 <beans> 2 ... 3 <bean id="testProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 4 abstract="true"> //********(1) 5 <property name="transactionManager" > 6 <ref bean="transactionManager"/> 7 </property> 8 <property name="proxyTargetClass" value="true" /> 9 10 <property name="transactionAttributes"> 11 <props> 12 <prop key="*insert*">PROPAGATION_REQUIRED</prop> 13 <prop key="*select*">PROPAGATION_REQUIRED,readOnly</prop> 14 </props> 15 </property> 16 </bean> 17 18 <bean id="test" parent="testProxy"> 19 <property name="target"> 20 <ref bean="testit"/> //******(2) 21 </property> 22 </bean> 23 </beans>
為了解決代碼的低重用,我在testProxy里沒有定義target屬性,targe屬性t的定義放在了外面一個bean里,這個bean繼承了testProxy(parent),這樣bean中parent中已注入的屬性不需要再注入,在子bean中只需要注入還沒有注入的屬性即可!注意:也只能注入
TransactionProxyFactoryBean
中有的屬性,重復了覆蓋,但是不能注入其他任何屬性
2、如果父bean沒有定義class屬性,子bean必須定義class屬性,這時候父bean實際上僅僅是一個純模版或抽象bean,僅僅充當子定義的父定義。若要嘗
1 <beans> 2 <bean id="parentBean"> 3 <property name="name"><value>parent</value></property> 4 <property name="age"><value>1</value></property> 5 </bean> 6 <bean id="sunBean" class="SunBean" 7 parent="parentBean" init-method="initialize"> 8 <property name="name"><value>override</value></property> 9 </bean>
試單獨使用這樣的parent bean(比如將它作為其他bean的ref屬性而引用,或者直接使用這個parent bean的id調用getBean()方法),將會導致一個錯誤。這個父bean的功能也就是為了減少配置的書寫而采用的,舉例如下,如果有n個bean都要配置m個相同的屬性,如果不采用父bean概念,將要配置這m個屬性n次,采用父bean方式將這共同的m個屬性配置在父bean中,而在這n個bean中都增加一個parent屬性 指向那個bean就可以。(這里的m個屬性也要滿足必要條件,都在子bean對應的類中定義)