這篇文章來自我的部落格
正文之前
終於開始學 Spring 了,接觸到的第一個內容就是 Bean,所以想要用兩篇文章來總結一下自己所學的
第一篇有兩個內容:
- JavaBean 的概念
- Spring 裝配 Bean
正文
1. JavaBean 的概念
JavaBean 是什麼
這裡的 Bean 當然不是直譯過來的意思,關於Bean的定義,維基百科解釋的很清楚了:
JavaBeans 是 Java 中一種特殊的類,可以將多個物件封裝到一個物件(bean)中,特點是可序列化,提供無參構造器,提供 getter 方法和 setter 方法訪問物件的屬性。名稱中的 "Bean" 是用於Java的可重用軟體元件的慣用叫法
Bean的例子
- 建立Bean類
import java.io.Serializable;
public class UserBean implements Serializable {
//變數宣告為私有
private String play;
private Boolean isUser;
//無參構造器
public UserBean(){}
//常規 set、get操作
public void setPlay(String play) { this.play = play; }
public String getPlay() { return play; }
public void setUser(Boolean user) { isUser = user; }
//布林型別的 getter 採用了不同的名稱,用 is 更加能表示型別
public Boolean isUser() { return isUser; }
}
複製程式碼
- 使用Bean類
public class UserBeanTest {
public static void main(String[] args){
//例項化
UserBean userBean = new UserBean();
userBean.setPlay("I want to play");
userBean.setUser(true);
//如果是使用者,就列印語句
if(userBean.isUser()){
System.out.println(userBean.getPlay());
}
}
}
複製程式碼
引用《Spring實戰》(Spring in action) 中的一句話:
在傳統的Java應用中,bean的生命週期很簡單。使用Java關鍵字new進行bean例項化,然後該bean就可以使用了。一旦該bean不再被使用,則由Java自動進行垃圾回收
2. Spring 中的 Bean
在 Spring 中,我們對 Bean 進行配置並加以使用,來得到我們需要的結果
在上述的例子中,如果我們要建立一個 Bean,我們就要使用關鍵字 New,但是,在 Spring 中,Bean 的建立是由 Spring 容器進行的,也就是說,在 Spring 中使用 Bean 的時候,不是由關鍵字 New 來建立例項了
今天主要說說 Spring 中單個 Bean 的裝配,只有一個 Bean,下一篇文章會講述 DI(依賴注入):
- 自動裝配
- 使用 XML 裝配
- 使用 Java 裝配
1. 自動裝配
引用《Spring實戰》中的一句話:儘管你會發現這些顯示裝配技術非常有用,但是在便利性方面,最強大的還是 Spring 的自動化配置
我們用一個 Demo 來做解釋,首先建立兩個類:Student 類和 StudentTest 類,以及一個配置檔案 spring-config.xml:
我們要先編寫配置檔案,使其啟用元件掃描,來發現帶有註解 @Component 註解的類,因為我之前由寫過關於 Spring MVC 的 demo,所以有關 @Component、 @Service 和 @Controller 的區別做一個小小的解釋(個人理解):
@Component 泛指元件類,就是在自身定位不明確的時候使用,比如我們這個Demo @Service 表明這是業務層的元件 @Controller 表明這是控制層的元件 在業務層和控制層也可以用 @Component,但是這會導致程式碼不易讀
回到配置檔案:
這一行:
<context:component-scan base-package="bean"/>
複製程式碼
指示了 Spring 要掃描的元件所處於的位置(包名),如果不設定 base-package,則掃描配置檔案所處於的包
然後我們看一下 Student 類:
這裡只是為了測試,所以極大程度地簡化,只需要一句控制檯輸出語句
由於我們之前配置了元件掃描,所以點選旁邊的標誌,就能夠跳轉到我們新增了 @Component 註解的 Student 類
萬事俱備,就差測試了,我們使用 Junit 來進行測試,需要匯入兩個 JAR:
junit-4.12.jar hamcrest-all-1.3.jar
針對測試檔案中的內容一步一步來:
- @RunWith:這個單元測試指定的執行類(目前還不是很瞭解)
- @ContextConfiguration:配置檔案的位置,因為我是用 XML 檔案進行配置,所以填寫配置檔案位置
- @Autowired:自動裝配 Bean,在這裡可以看到沒有使用 New 關鍵字,但是能夠在執行時得到這個 Bean
- @Test:執行測試的方法
能夠看到控制檯輸出了 Student 類中的語句,證明裝配成功
2. 使用 XML 裝配
這一篇文章講述的只是簡單的裝配,所以有很多有關依賴注入的方式都將跳過,由下一篇文章來講
所以這裡只演示在 XML 檔案中建立一個 Bean 並進行裝配
首先我們新建一個配置檔案 spring-bean.xml:
在其中建立用元素建立一個叫做“student”的 Bean,class屬性用來指定 Bean 的型別
然後我們修改測試檔案中的上下文的配置資訊:
我們將 @ContextConfiguration 註解的值改為了配置 Bean 的檔案
輸出結果:
證明裝配成功
3. 使用 Java 裝配
在《Spring實戰》中大力推崇使用 Java 作為裝配,可能是我不太習慣,之前都是把配置資訊寫在 XML 檔案裡,不過這裡還是要說一下:
我們將建立一個類,作為存放配置資訊的類,先加上 @Configuration,說明這是一個配置類:
接下來,我們要在配置類中使用一個註解:@Bean:
我們在配置類中寫一個方法,這個方法能夠建立所需要的例項並將其返回,並將 @Bean 新增至這個方法,這個方法的名稱是作為 Bean 預設的名稱:
然後我們要修改測試類,將配置上下文的檔案改為 StudentConfig.class,表明 Java 配置類的位置:
然後得出測試結果,證明裝配成功:
關於剛才說到的方法的名稱是作為 Bean 預設的名稱,這裡做個測試:
先修改配置類中的方法名,加一個字元“s”:
然後修改測試類,在這個測試中,我們沒有建立例項,只是測試一下看看能不能在上下文中發現這個 Bean :
測試後,丟擲 NoSuchBeanDefinitionException,表示沒有發現名叫“student”的 Bean
如果我把剛才修改的方法名改回來,就會通過測試:
關於最基礎的 Bean 的裝配就說到這裡了,下一篇文章中將會詳細講述這三種方式的細節