代码将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指向不同的地址.