Spring IOC容器

IoC 容器

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 IoC 容器

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

Spring 的 BeanFactory 容器

  這是一個最簡單的容器,它主要的功能是爲依賴注入 (DI) 提供支持,這個容器接口在 org.springframework.beans.factory.BeanFactor 中被定義。spa

BeanFactory 和相關的接口,好比BeanFactoryAwareDisposableBeanInitializingBean,仍舊保留在 Spring 中,主要目的是向後兼容已經存在的和那些 Spring 整合在一塊兒的第三方框架。code

Spring 中,有大量對 BeanFactory 接口的實現。其中,最常被使用的是 XmlBeanFactory 類。這個容器從一個 XML 文件中讀取配置元數據,由這些元數據來生成一個被配置化的系統或者應用。

在資源寶貴的移動設備或者基於 applet 的應用當中, BeanFactory 會被優先選擇。不然,通常使用的是 ApplicationContext,除非你有更好的理由選擇 BeanFactory

Spring ApplicationContext 容器

ApplicationContext BeanFactory 的子接口,也被成爲 Spring 上下文。

ApplicationContext 是 spring 中較高級的容器。和 BeanFactory 相似,它能夠加載配置文件中定義的 bean,將全部的 bean 集中在一塊兒,當有請求的時候分配 bean。 另外,它增長了企業所須要的功能,好比,從屬性文件中解析文本信息和將事件傳遞給所指定的監聽器。這個容器在 org.springframework.context.ApplicationContext interface 接口中定義。

ApplicationContext 包含 BeanFactory 全部的功能,通常狀況下,相對於 BeanFactoryApplicationContext 會更加優秀。固然,BeanFactory 仍能夠在輕量級應用中使用,好比移動設備或者基於 applet 的應用程序。

最常被使用的 ApplicationContext 接口實現:

  • FileSystemXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你須要提供給構造器 XML 文件的完整路徑。

  • ClassPathXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你不須要提供 XML 文件的完整路徑,只需正確配置 CLASSPATH 環境變量便可,由於,容器會從 CLASSPATH 中搜索 bean 配置文件。

  • WebXmlApplicationContext:該容器會在一個 web 應用程序的範圍內加載在 XML 文件中已被定義的 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 }

代碼結構圖:

相關文章
相關標籤/搜索