《Spring MVC學習指南(第2版)》——第1章 Spring框架 1.1XML配置文件
本節書摘來自異步社區《Spring MVC學習指南(第2版)》一書中的第1章,第1.1節,作者:【美】Paul Deck著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
第1章 Spring框架
Spring框架是一個開源的企業應用開發框架,作為一個輕量級的解決方案,它包含20多個不同的模塊。本書主要關注Core、Spring Bean、Spring MVC和Spring MVC Test模塊。
本章主要介紹Core和Spring Bean這兩個模塊,以及它們如何提供依賴注入解決方案。為方便初學者,本書會深入討論依賴注入概念的細節。後續介紹開發MVC應用的章節將會使用到本章介紹的技能。
依賴注入
簡單來說,依賴注入的情況如下。
有兩個組件A和B,A依賴於B。假定A是一個類,且A有一個方法importantMethod用到了B,如下:
public class A {
public void importantMethod() {
B b = ... // get an instance of B
b.usefulMethod();
...
}
...
}
要使用B,類A必須先獲得組件B的實例引用。若B是一個具體類,則可通過new關鍵字直接創建組件B實例。但是,如果B是接口,且有多個實現,則問題就變得複雜了。我們固然可以任意選擇接口B的一個實現類,但這也意味著A的可重用性大大降低了,因為無法采用B的其他實現。
依賴注入是這樣處理此類情景的:接管對象的創建工作,並將該對象的引用注入需要該對象的組件。以上述情況為例,依賴注入框架會分別創建對象A和對象B,將對象B注入到對象A中。
為了能讓框架進行依賴注入,程序員需要編寫特定的set方法或者構建方法。例如,為了能將B注入到A中,類A會被修改成如下形式:
public class A {
private B b;
public void importantMethod() {
// no need to worry about creating B anymore
// B b = ... // get an instance of B
b.usefulMethod();
...
}
public void setB(B b) {
this.b = b;
}
}
修改後的類A新增了一個set方法,該方法將會被框架調用,以注入B的一個實例。由於對象依賴由依賴注入,類A的importantMethod方法不再需要在調用B的usefulMethod方法前去創建B的一個實例。
當然,也可以采用構造器方式注入,如下所示:
public class A {
private B b;
public A(B b) {
this.b = b;
}
public void importantMethod() {
// no need to worry about creating B anymore
// B b = ... // get an instance of B
b.usefulMethod();
...
}
}
本例中,Spring會先創建B的實例,再創建實例A,然後把B注入到實例A中。
注:
Spring管理的對象稱為beans。
通過提供一個控製反轉容器(或者依賴注入容器),Spring為我們提供一種可以“聰明”地管理Java對象依賴關係的方法。其優雅之處在於,程序員無需了解Spring框架的存在,更不需要引入任何Spring類型。
從1.0版本開始,Spring就同時支持setter和構造器方式的依賴注入。從2.5版本開始,通過Autowired注解,Spring支持基於field方式的依賴注入,但缺點是程序必須引入org.springframework.beans.factory.annotation.Autowired,這對Spring產生了依賴,這樣,程序無法直接遷移到另一個依賴注入容器間。
使用Spring,程序幾乎將所有重要對象的創建工作移交給Spring,並配置如何注入依賴。Spring支持XML或注解兩種配置方式。此外,還需要創建一個ApplicationContext對象,代表一個Spring控製反轉容器,org.springframework.context.ApplicationContext接口有多個實現,包括ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。這兩個實現都需要至少一個包含beans信息的XML文件。ClassPathXmlApplicationContext嚐試在類加載路徑中加載配置文件,而FileSystemXmlApplicationContext則從文件係統中加載。
下麵是從類路徑中加載config1.xml和config2.xml的ApplicationContext創建的一個代碼示例。
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"config1.xml", "config2.xml"});
可以通過調用ApplicationContext的getBean方法獲得對象。
Product product = context.getBean("product", Product.class);
getBean方法會查詢id為product且類型為Product的bean對象。
注:
理想情況下,我們隻需在測試代碼中創建一個ApplicationContext,應用程序本身無需處理。對於Spring MVC應用,可以通過一個Spring Servlet來處理ApplicationContext,而無需直接處理。
1.1 XML配置文件
從1.0版本開始,Spring就支持基於XML的配置;從2.5版本開始,增加了通過注解的配置支持。下麵介紹如何配置XML文件。配置文件的根元素通常為beans:
< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
...
< /beans>
如果需要更強的Spring配置能力,可以在schema location屬性中添加相應的schema,也可以指定schema版本:
https://www.springframework.org/schema/beans/spring-beans-4.2.xsd
不過,筆者推薦使用默認schema,以便升級spring庫時無需修改配置文件。
配置文件既可以是一份,也可以分解為多份,以支持模塊化配置。ApplicationContext的實現類支持讀取多份配置文件。另一種選擇是,通過一份主配置文件,將該文件導入到其他配置文件。
下麵是導入其他配置文件的一個示例:
< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
< import resource="config1.xml"/>
< import resource="module2/config2.xml"/>
< import resource="/resources/config3.xml"/>
...
< /beans>
bean元素的配置後麵將會詳細介紹。
最後更新:2017-05-27 12:01:26