代碼將weyspringofioc
1.先寫一個(gè)類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"> <!--將這個(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端的程序
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容器中獲取實(shí)例.
然后就可以通過實(shí)例取得相應(yīng)的屬性.而這個(gè)bean2,每次實(shí)例化都會都是相同的一個(gè).
這樣就大功告成.讓我們見證奇跡發(fā)生的一刻:
1
bean2.bean3.id=10
2
bean2.bean3.name=這個(gè)在公共中有定義值.如果bean3中再定義.則以bean3覆蓋原來的配置內(nèi)容
3
bean2.bean3.password=1235
4
bean2.bean4.id=10
5
bean2.bean4.name=tom
6
bean2.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如下:
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即可
我們執(zhí)行會發(fā)現(xiàn)打印出 bean1和bean2指向同一地址.
如果在配置文件修改為:
1
<bean id="bean789" class="com.zyl.spring.Bean789" scope="prototype">
修改scope
打印結(jié)果就會說明bean1和bean2指向不同的地址.