代码将weyspringofioc
1.先写一个类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"> <!--将这个类声明成抽象类 -->
 4     <property name="id" value="10"/>  <!-- 属性即是bean3和bean4两个类共有的元素.并赋值 -->
 5     <property name="name" value="tom"/>
 6  </bean>
 7  <!-- 配置bean3 和bean 4 -->
 8    <!-- 使用parent的值为上面注册的id:bean34. 相当于bean3继承bean34 -->
 9  <bean id="bean3" class="com.zyl.spring.Bean3" parent="bean34">
10     <property name="password" value="1235"/>  <!-- 在bean3中只需配置公共部分没有的,自己独有的属性即可 -->
11     <property name="name" value="这个在公共中有定义值.如果bean3中再定义.则以bean3覆盖原来的配置内容"></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"/><!-- 设定值为10 -->
24  </bean>
1).注意看,第3行,定义公共的注入属性,通过<bean>标签定义,制定abstract=”true”.属性中抽取了Bean3和Bean4的公共部分.并且用value赋值(也可以用ref指向.)
2).在第9行注册Bean3的时候, 使用parent标签,  指定parent属性值为定义的公共描述.有点类似继承公共描述的意思.
    这样Bean3的配置中就可以不配置公共描述的元素了.当然.如果想自己配置也可,独自的配置会覆盖公共的配置而起作用.
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容器中获取实例.
然后就可以通过实例取得相应的属性.而这个bean2,每次实例化都会都是相同的一个.

这样就大功告成.让我们见证奇迹发生的一刻:
1bean2.bean3.id=10
2bean2.bean3.name=这个在公共中有定义值.如果bean3中再定义.则以bean3覆盖原来的配置内容
3bean2.bean3.password=1235
4bean2.bean4.id=10
5bean2.bean4.name=tom
6bean2.bean5.age=10
这篇就到这里吧. 有疑问可与我讨论. (虽然我也很菜.)
P.S
文中蓝色/红色字体进一步阐述:
spring配置文件中bean的作用域
1.scope取值: singleton (默认)
  每次调用getBean 返回相同的实例
2.scope取值: prototype
  每次调用getBean 返回不同的实例
见代码whyspringofioc2
写个简单的bean789里面啥也不要.
写个简单的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即可
我们执行会发现打印出 bean1和bean2指向同一地址.
如果在配置文件修改为:
1<bean id="bean789" class="com.zyl.spring.Bean789" scope="prototype">
修改scope
打印结果就会说明bean1和bean2指向不同的地址.