代码将weyspringofioc
1.先写一个类Bean2.java
1
package com.zyl.spring;
2
3
public 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
1
package com.zyl.spring;
2
3
public 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
1
package com.zyl.spring;
2
3
public 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
1
package com.zyl.spring;
2
3
public 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端的程序
1
package test;
2
3
import junit.framework.TestCase;
4
5
import org.springframework.beans.factory.BeanFactory;
6
import org.springframework.context.support.ClassPathXmlApplicationContext;
7
8
import com.zyl.spring.Bean1;
9
import com.zyl.spring.Bean2;
10
11
12
public class test extends TestCase
{
13
public 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,每次实例化都会都是相同的一个.
这样就大功告成.让我们见证奇迹发生的一刻:
1
bean2.bean3.id=10
2
bean2.bean3.name=这个在公共中有定义值.如果bean3中再定义.则以bean3覆盖原来的配置内容
3
bean2.bean3.password=1235
4
bean2.bean4.id=10
5
bean2.bean4.name=tom
6
bean2.bean5.age=10
这篇就到这里吧. 有疑问可与我讨论. (虽然我也很菜.)
P.S
文中蓝色/红色字体进一步阐述:
spring配置文件中bean的作用域
1.scope取值: singleton (默认)
每次调用getBean 返回相同的实例
2.scope取值: prototype
每次调用getBean 返回不同的实例
见代码whyspringofioc2
写个简单的bean789里面啥也不要.
写个简单的test如下:
1
public 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指向不同的地址.