在spring中,如果某個bean所依賴的bean不想被spring容器直接通路,可以使用嵌套bean。和普通的bean一樣,使用<bean>元素來定義嵌套的bean,嵌套bean隻對它的外部的bean有效,spring容器無法直接通路嵌套的bean,是以定義嵌套bean也無需指定id屬性。如下配置片段是一個嵌套bean的示例:
<a href="http://my.oschina.net/itblog/blog/204378#">?</a>
1
2
3
4
5
6
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"student"</code> <code>class</code><code>=</code><code>"com.abc.student"</code><code>></code>
<code> </code><code><!-- 下面是一個普通的屬性 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"name"</code> <code>value</code><code>=</code><code>"張三"</code> <code>/></code>
<code> </code><code><!-- 下面的屬性是一個嵌套的bean,對于和student平級的bean來說,這個bean是不可見的,spring容器也無法通路 --></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"com.abc.school"</code> <code>/></code>
<code></</code><code>bean</code><code>></code>
采用上面的配置形式可以保證嵌套bean不能被容器通路,是以不用擔心其他程式修改嵌套bean。外部bean的用法和使用結果和以前沒有差別。
嵌套bean提高了bean的内聚性,但是降低了程式的靈活性。隻有在确定無需通過spring容器通路某個bean執行個體時,才考慮使用嵌套bean來定義。
使用嵌套bean與使用ref引用容器中另一個bean在本質上是一樣的,但是,如果使用ref,則ref的這個bean不僅可以被容器直接通路(如使用classpathxmlapplicationcontext的getbean()方法擷取其執行個體),還可以為其它的bean所使用(如果這些bean中含有這個類型的屬性)。是以是否使用嵌套bean,得看實際需求。