代碼將weyspringofioc
1.先寫一個(gè)類Bean2.java

 1package com.zyl.spring;
 2
 3public class Bean2 {
 4    
 5    private Bean3 bean3;
 6    private Bean4 bean4;
 7    private Bean5 bean5;
 8    
 9    
10    public Bean3 getBean3() {
11        return bean3;
12    }

13    public void setBean3(Bean3 bean3) {
14        this.bean3 = bean3;
15    }

16    public Bean4 getBean4() {
17        return bean4;
18    }

19    public void setBean4(Bean4 bean4) {
20        this.bean4 = bean4;
21    }

22    public Bean5 getBean5() {
23        return bean5;
24    }

25    public void setBean5(Bean5 bean5) {
26        this.bean5 = bean5;
27    }

28}

29
我們看到里面有依賴Bean3 Bean4 Bean5
2.我們完成Bean3.4.5
Bean3.java
 1package com.zyl.spring;
 2
 3public class Bean3 {
 4   
 5     private int id;
 6     
 7     private String name;
 8     
 9     private String password;
10
11    public int getId() {
12        return id;
13    }

14
15    public void setId(int id) {
16        this.id = id;
17    }

18
19    public String getName() {
20        return name;
21    }

22
23    public void setName(String name) {
24        this.name = name;
25    }

26
27    public String getPassword() {
28        return password;
29    }

30
31    public void setPassword(String password) {
32        this.password = password;
33    }

34     
35}

36
Bean4.java
 1package com.zyl.spring;
 2
 3public class Bean4 {
 4    
 5     private int id;
 6     
 7     private String name;
 8
 9    public int getId() {
10        return id;
11    }

12
13    public void setId(int id) {
14        this.id = id;
15    }

16
17    public String getName() {
18        return name;
19    }

20
21    public void setName(String name) {
22        this.name = name;
23    }

24}

25
Bean5.java
 1package com.zyl.spring;
 2
 3public class Bean5 {
 4    private int age;
 5
 6    public int getAge() {
 7        return age;
 8    }

 9
10    public void setAge(int age) {
11        this.age = age;
12    }

13}

14
注意看.Bean3和Bean4.有相同的屬性id 和name
3.接下來配置文件出場:
 1<!-- other -->
 2  <!-- 配置bean3和bean4共用的部分抽取出來 -->
 3  <bean id="bean34" abstract="true"> <!--將這個(gè)類聲明成抽象類 -->
 4     <property name="id" value="10"/>  <!-- 屬性即是bean3和bean4兩個(gè)類共有的元素.并賦值 -->
 5     <property name="name" value="tom"/>
 6  </bean>
 7  <!-- 配置bean3 和bean 4 -->
 8    <!-- 使用parent的值為上面注冊的id:bean34. 相當(dāng)于bean3繼承bean34 -->
 9  <bean id="bean3" class="com.zyl.spring.Bean3" parent="bean34">
10     <property name="password" value="1235"/>  <!-- 在bean3中只需配置公共部分沒有的,自己獨(dú)有的屬性即可 -->
11     <property name="name" value="這個(gè)在公共中有定義值.如果bean3中再定義.則以bean3覆蓋原來的配置內(nèi)容"></property>
12  </bean>
13  <bean id="bean4" class="com.zyl.spring.Bean4" parent="bean34"></bean>
14  <!-- 以下配置bean3.4.5 -->
15  <bean id="bean2" class="com.zyl.spring.Bean2">
16      <property name="bean3" ref="bean3"/><!-- bean2用引用了bean3.4.5 -->
17      <property name="bean4">
18         <ref bean="bean4"/>  <!-- 這種寫法和上面那種效果一樣 -->
19      </property>
20      <property name="bean5" ref="bean5"/> <!-- name為bean2中定義的變量名,ref為配置文件的id名 -->
21  </bean>  
22  <bean id="bean5" class="com.zyl.spring.Bean5"> <!-- 接下來描述bean5的元素 -->
23      <property name="age" value="10"/><!-- 設(shè)定值為10 -->
24  </bean>
1).注意看,第3行,定義公共的注入屬性,通過<bean>標(biāo)簽定義,制定abstract=”true”.屬性中抽取了Bean3和Bean4的公共部分.并且用value賦值(也可以用ref指向.)
2).在第9行注冊Bean3的時(shí)候, 使用parent標(biāo)簽,  指定parent屬性值為定義的公共描述.有點(diǎn)類似繼承公共描述的意思.
    這樣Bean3的配置中就可以不配置公共描述的元素了.當(dāng)然.如果想自己配置也可,獨(dú)自的配置會覆蓋公共的配置而起作用.
3)Bean5并沒有公共描述的東西,就一般配置下即可.見第20行.
4.最后,寫一下client端的程序
 1package test;
 2
 3import junit.framework.TestCase;
 4
 5import org.springframework.beans.factory.BeanFactory;
 6import org.springframework.context.support.ClassPathXmlApplicationContext;
 7
 8import com.zyl.spring.Bean1;
 9import com.zyl.spring.Bean2;
10
11
12public class test extends TestCase {
13public void testInjection2(){
14        BeanFactory factory =new ClassPathXmlApplicationContext("gogogo-*.xml");//加上配置文件xml的名字
15           
16        Bean2 bean2=(Bean2)factory.getBean("bean2");//讀取xml中id為bean2的東東
17        
18        System.out.println("bean2.bean3.id="+bean2.getBean3().getId());
19        System.out.println("bean2.bean3.name="+bean2.getBean3().getName());
20        System.out.println("bean2.bean3.password="+bean2.getBean3().getPassword());
21        System.out.println("bean2.bean4.id="+bean2.getBean4().getId());
22        System.out.println("bean2.bean4.name="+bean2.getBean4().getName());
23        System.out.println("bean2.bean5.age="+bean2.getBean5().getAge());
24    }

25}

26
第16行這句: Bean2 bean2=(Bean2)factory.getBean("bean2"); spring幫忙我們從ioc容器中獲取實(shí)例.
然后就可以通過實(shí)例取得相應(yīng)的屬性.而這個(gè)bean2,每次實(shí)例化都會都是相同的一個(gè).

這樣就大功告成.讓我們見證奇跡發(fā)生的一刻:
1bean2.bean3.id=10
2bean2.bean3.name=這個(gè)在公共中有定義值.如果bean3中再定義.則以bean3覆蓋原來的配置內(nèi)容
3bean2.bean3.password=1235
4bean2.bean4.id=10
5bean2.bean4.name=tom
6bean2.bean5.age=10
這篇就到這里吧. 有疑問可與我討論. (雖然我也很菜.)
P.S
文中藍(lán)色/紅色字體進(jìn)一步闡述:
spring配置文件中bean的作用域
1.scope取值: singleton (默認(rèn))
  每次調(diào)用getBean 返回相同的實(shí)例
2.scope取值: prototype
  每次調(diào)用getBean 返回不同的實(shí)例
見代碼whyspringofioc2
寫個(gè)簡單的bean789里面啥也不要.
寫個(gè)簡單的test如下:
 1public void testScope(){
 2        
 3                BeanFactory factory =new ClassPathXmlApplicationContext("gogogo-*.xml");//加上配置文件xml的名字
 4               
 5                Bean789 bean1=(Bean789)factory.getBean("bean789");//bean789為xml中取的id名字
 6                Bean789 bean2=(Bean789)factory.getBean("bean789");
 7                if(bean1==bean2){
 8                    System.out.println("bean1和bean2指向同一地址");
 9                    
10                }
else{
11                    System.out.println("bean1和bean2不指向同一地址");
12                }

13                
14            }
配置文件中注冊下bean789即可
我們執(zhí)行會發(fā)現(xiàn)打印出 bean1和bean2指向同一地址.
如果在配置文件修改為:
1<bean id="bean789" class="com.zyl.spring.Bean789" scope="prototype">
修改scope
打印結(jié)果就會說明bean1和bean2指向不同的地址.