Spring 容器是 Spring 框架的核心。容器將建立對象,把它們鏈接在一塊兒,配置它們,並管理他們的整個生命週期從建立到銷燬。html
Spring 容器使用依賴注入(DI)來管理組成一個應用程序的組件。這些對象被稱爲 Spring Beans。程序員
經過閱讀配置元數據提供的指令,容器知道對哪些對象進行實例化,配置和組裝。配置元數據能夠經過 XML,Java 註釋或 Java 代碼來表示。下圖是 Spring 如何工做的高級視圖。 Spring IoC 容器利用 Java 的 POJO 類和配置元數據來生成徹底配置和可執行的系統或應用程序。web
IOC 容器具備依賴注入功能的容器,它能夠建立對象,IOC 容器負責實例化、定位、配置應用程序中的對象及創建這些對象間的依賴。一般new一個實例,控制權由程序員控制,而"控制反轉"是指new實例工做不禁程序員來作而是交給Spring容器來作。在Spring中BeanFactory是IOC容器的實際表明者。spring
Spring 提供瞭如下兩種不一樣類型的容器。app
序號 | 容器 & 描述 |
---|---|
1 | Spring BeanFactory 容器 它是最簡單的容器,給 DI 提供了基本的支持,它用 org.springframework.beans.factory.BeanFactory 接口來定義。BeanFactory 或者相關的接口,如 BeanFactoryAware,InitializingBean,DisposableBean,在 Spring 中仍然存在具備大量的與 Spring 整合的第三方框架的反向兼容性的目的。框架 |
2 | Spring ApplicationContext 容器 該容器添加了更多的企業特定的功能,例如從一個屬性文件中解析文本信息的能力,發佈應用程序事件給感興趣的事件監聽器的能力。該容器是由 org.springframework.context.ApplicationContext 接口定義。測試 |
ApplicationContext 容器包括 BeanFactory 容器的全部功能,因此一般建議超過 BeanFactory。BeanFactory 仍然能夠用於輕量級的應用程序,如移動設備或基於 applet 的應用程序,其中它的數據量和速度是顯著。this
這是一個最簡單的容器,它主要的功能是爲依賴注入 (DI) 提供支持,這個容器接口在 org.springframework.beans.factory.BeanFactor 中被定義。spa
BeanFactory 和相關的接口,好比BeanFactoryAware、DisposableBean、InitializingBean,仍舊保留在 Spring 中,主要目的是向後兼容已經存在的和那些 Spring 整合在一塊兒的第三方框架。code
在 Spring 中,有大量對 BeanFactory 接口的實現。其中,最常被使用的是 XmlBeanFactory 類。這個容器從一個 XML 文件中讀取配置元數據,由這些元數據來生成一個被配置化的系統或者應用。
在資源寶貴的移動設備或者基於 applet 的應用當中, BeanFactory 會被優先選擇。不然,通常使用的是 ApplicationContext,除非你有更好的理由選擇 BeanFactory。
ApplicationContext 是 BeanFactory 的子接口,也被成爲 Spring 上下文。
ApplicationContext 是 spring 中較高級的容器。和 BeanFactory 相似,它能夠加載配置文件中定義的 bean,將全部的 bean 集中在一塊兒,當有請求的時候分配 bean。 另外,它增長了企業所須要的功能,好比,從屬性文件中解析文本信息和將事件傳遞給所指定的監聽器。這個容器在 org.springframework.context.ApplicationContext interface 接口中定義。
ApplicationContext 包含 BeanFactory 全部的功能,通常狀況下,相對於 BeanFactory,ApplicationContext 會更加優秀。固然,BeanFactory 仍能夠在輕量級應用中使用,好比移動設備或者基於 applet 的應用程序。
最常被使用的 ApplicationContext 接口實現:
FileSystemXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你須要提供給構造器 XML 文件的完整路徑。
ClassPathXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你不須要提供 XML 文件的完整路徑,只需正確配置 CLASSPATH 環境變量便可,由於,容器會從 CLASSPATH 中搜索 bean 配置文件。
Server:
1 public interface UserService { 2 3 /* 4 * 說話 5 */ 6 void Say(String msg); 7 }
ServerImpl:
1 public class UserServiceImpl implements UserService { 2 3 private UserDao userDao; 4 5 public void setUserDao(UserDao dao) { 6 this.userDao=dao; 7 } 8 9 /* 10 * 說話 11 */ 12 public void Say(String msg) { 13 this.userDao.Say(msg); 14 } 15 }
Dao:
1 public interface UserDao { 2 3 /* 4 * 說話 5 */ 6 void Say(String msg); 7 8 }
DaoImpl:
1 public class UserDaoImpl implements UserDao { 2 3 /* 4 * 說話 5 */ 6 public void Say(String msg) { 7 System.out.println(msg); 8 } 9 10 }
Beans:
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 7 <bean id="userServerId" class="serviceImpl.UserServiceImpl"> 8 <!-- 此處是set屬性注入,name值必須和UserServiceImpl中屬性名一致 --> 9 <property name="userDao" ref="userDaoId"></property> 10 </bean> 11 12 <bean id="userDaoId" class="daoImpl.UserDaoImpl"></bean> 13 14 </beans>
測試運行:
1 public class MainShow { 2 3 public static void main(String[] args) { 4 System.out.println("開始執行。。。"); 5 6 ApplicationContext context=new ClassPathXmlApplicationContext("resources/beans.xml"); 7 UserService idog=(UserService)context.getBean("userServerId"); 8 idog.Say("汪汪汪。。。"); 9 } 10 11 }
代碼結構圖: