spring bean parent屬性詳解


必要條件: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對應的類中定義)


免責聲明!

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



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