Spring学习笔记3:深入学习IOC
本文将在Spring学习笔记2:Spring概述及IOC的基础上,继续对Spring进行学习。
1.引用其他的bean
在实际应用中,一个bean中包含其他bean的情况是经常会发生的,下面通过例子来对这种情况进行学习。
//步骤1:在com.atguigu.ioc.bean包中添加,BookShop类
package com.atguigu.ioc.bean;
public class BookShop {
//该类中包含了一个名称为myBook的Book类的成员
private Book mybook;
public BookShop() {}
public Book getMybook() {
return mybook;
}
public void setMybook(Book mybook) {
this.mybook = mybook;
}
@Override
public String toString() {
return "BookShop [mybook=" + mybook + "]";
}
}
//步骤2:在beans.xml中添加如下配置
<!-- 实验8:引用其他的bean -->
<bean id="bookShop01" class="com.atguigu.ioc.bean.BookShop">
<!-- 通过设置ref,使用其他已经配置好的book给myBook属性赋值 -->
<property name="mybook" ref="book03"></property>
</bean>
//步骤3:创建测试方法
@Test
public void test08()
{
BookShop bookShop = (BookShop)ioc.getBean("bookShop01");
Book book = bookShop.getMybook();
System.out.println(bookShop);
System.out.println(book);
}
运行结果如下:
2.引用内部bean
上面是例子讲的是外部bean的引用,同时SpringIOC也支持在一个bean中直接声明另一个bean的配置并将其引用,例子如下:
//步骤1:在BookShop类中田间Book innerBook属性,并添加get set方法、重写toString()
package com.atguigu.ioc.bean;
public class BookShop {
//测试引用外部bean
private Book mybook;
//测试引用内部bean
private Book innerBook;
public BookShop() {}
public Book getMybook() {
return mybook;
}
public void setMybook(Book mybook) {
this.mybook = mybook;
}
public Book getInnerBook() {
return innerBook;
}
public void setInnerBook(Book innerBook) {
this.innerBook = innerBook;
}
@Override
public String toString() {
return "BookShop [mybook=" + mybook + "]";
}
}
//步骤2:将配置文件beans.xml中的bookShop01修改如下:
<!-- 实验9:引用内部bean -->
<!-- 实验8:引用其他的bean -->
<bean id="bookShop01" class="com.atguigu.ioc.bean.BookShop">
<!-- 使用其他已经配置好的book给myBook属性赋值 -->
<property name="mybook" ref="book03"></property>
<property name="innerBook">
<!-- 这是一个内部Bean,就是个innerBook属性用的,因此可以不指定id值,
内部配置的Bean在外部无法使用-->
<bean class="com.atguigu.ioc.bean.Book">
<property name="bookId" value="12345"/>
<property name="bookName" value="innerName"/>
<property name="author" value="innerAuthor"/>
<property name="prive" value="23456"/>
<property name="isbn" value="innerIsbn"></property>
</bean>
</property>
</bean>
//步骤3:修改测试方法test08()如下:
@Test
public void test08()
{
BookShop bookShop = (BookShop)ioc.getBean("bookShop01");
Book book = bookShop.getMybook();
Book innerBook = bookShop.getInnerBook();
System.out.println(bookShop);
System.out.println(book);
System.out.println(innerBook);
}
程序运行结果如下:
3.为集合类型的属性赋值
SpringIOC支持为bean中的集合属性赋值,包括List、Map、Properties等。
1. 对于List来说,通常在beans.xml中的<property>
下使用<list>
标签,在list标签下使用<ref>
标签(集合中存放的是bean类型)或<value>
标签为集合属性赋值,例子如下:
//步骤1:在BookShop中添加bookList属性,并添加get set方法、重写toString()
package com.atguigu.ioc.bean;
import java.util.List;
public class BookShop {
private Book mybook;
private Book innerBook;
private List<Book> bookList;
public BookShop() {}
public Book getMybook() {
return mybook;
}
public void setMybook(Book mybook) {
this.mybook = mybook;
}
public Book getInnerBook() {
return innerBook;
}
public void setInnerBook(Book innerBook) {
this.innerBook = innerBook;
}
public List<Book> getBookList() {
return bookList;
}
public void setBookList(List<Book> bookList) {
this.bookList = bookList;
}
@Override
public String toString() {
return "BookShop [mybook=" + mybook + ", innerBook=" + innerBook + ", bookList=" + bookList + "]";
}
}
//步骤2:将配置文件beans.xml中的bookShop01修改如下:
<!-- 实验9:引用内部bean -->
<!-- 实验8:引用其他的bean -->
<bean id="bookShop01" class="com.atguigu.ioc.bean.BookShop">
<property name="mybook" ref="book03"></property>
<property name="innerBook">
<bean class="com.atguigu.ioc.bean.Book">
<property name="bookId" value="12345"/>
<property name="bookName" value="innerName"/>
<property name="author" value="innerAuthor"/>
<property name="prive" value="23456"/>
<property name="isbn" value="innerIsbn"></property>
</bean>
</property>
<!-- 为集合属性赋值 -->
<property name="bookList">
<list>
<ref bean="book01"/>
<ref bean="book02"/>
<ref bean="book03"/>
</list>
</property>
</bean>
//步骤3:修改测试方法test08()如下:
@Test
public void test08()
{
BookShop bookShop = (BookShop)ioc.getBean("bookShop01");
Book book = bookShop.getMybook();
Book innerBook = bookShop.getInnerBook();
List<Book> bookList = bookShop.getBookList();
System.out.println("bookShop:" + bookShop);
System.out.println("book:" + book);
System.out.println("innerBook:" + innerBook);
System.out.println("===list中的部分===");
for (Book book2 : bookList) {
System.out.println(book2);
}
}
程序运行结果如下:
2. 对于Map类型来说,其配置方法如下:
//步骤1:在BookShop中添加bookMap属性,并添加get set方法,就不贴代码了。
//步骤2:将配置文件beans.xml中的bookShop01修改如下:
<bean id="bookShop01" class="com.atguigu.ioc.bean.BookShop">
<property name="mybook" ref="book03"></property>
<property name="innerBook">
<bean class="com.atguigu.ioc.bean.Book">
<property name="bookId" value="12345"/>
<property name="bookName" value="innerName"/>
<property name="author" value="innerAuthor"/>
<property name="prive" value="23456"/>
<property name="isbn" value="innerIsbn"></property>
</bean>
</property>
<property name="bookList">
<list>
<ref bean="book01"/>
<ref bean="book02"/>
<ref bean="book03"/>
</list>
</property>
<!-- 实验11:使用Map集合属性 -->
<property name="bookMap">
<map>
<entry>
<key>
<value>key01</value>
</key>
<ref bean="book01"/>
</entry>
<entry>
<key>
<value>key01</value>
</key>
<ref bean="book01"/>
</entry>
<entry>
<key>
<value>key02</value>
</key>
<ref bean="book02"/>
</entry>
</map>
</property>
</bean>
- 对于Properties类型来说来说,因为Properties类是Map接口下,HashTable类的子类,它String类型的键值对的形式保存数据,如图所示:
其配置方法如下:
//步骤1:在BookShop中添加prop属性,并添加get set方法,就不贴代码了。
//步骤2:将配置文件beans.xml中的bookShop01修改如下:
<bean id="bookShop01" class="com.atguigu.ioc.bean.BookShop">
<property name="mybook" ref="book03"></property>
<property name="innerBook">
<bean class="com.atguigu.ioc.bean.Book">
<property name="bookId" value="12345"/>
<property name="bookName" value="innerName"/>
<property name="author" value="innerAuthor"/>
<property name="prive" value="23456"/>
<property name="isbn" value="innerIsbn"></property>
</bean>
</property>
<property name="bookList">
<list>
<ref bean="book01"/>
<ref bean="book02"/>
<ref bean="book03"/>
</list>
</property>
<property name="bookMap">
<map>
<entry>
<key>
<value>key01</value>
</key>
<ref bean="book01"/>
</entry>
<entry>
<key>
<value>key01</value>
</key>
<ref bean="book01"/>
</entry>
<entry>
<key>
<value>key02</value>
</key>
<ref bean="book02"/>
</entry>
</map>
</property>
<!-- 实验12:使用Property子元素为Properties类型的属性赋值 -->
<property name="prop">
<props>
<prop key="key01">propValue01</prop>
<prop key="key02">propValue02</prop>
<prop key="key03">propValue03</prop>
</props>
</property>
</bean>