Spring3 -- IOC容器的基本原理 02

2.2.1 IoC容器的概念
IoC容器就是具有依賴注入功能的容器,IoC容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。應用程序無需直接在代碼中new相關的對象,應用程序由IoC容器進行組裝。在Spring中BeanFactory是IoC容器的實際代表者。
Spring IoC容器如何知道哪些是它管理的對象呢?這就需要配置文件,Spring IoC容器通過讀取配置文件中的配置元數據,通過元數據對應用中的各個對象進行實例化及裝配。一般使用基於xml配置文件進行配置元數據,而且Spring與配置文件完全解耦的,可以使用其他任何可能的方式進行配置元數據,比如註解、基於java文件的、基於屬性文件的配置都可以。
那Spring IoC容器管理的對象叫什麼呢?
2.2.2 Bean的概念
由IoC容器管理的那些組成你應用程序的對象我們就叫它Bean, Bean就是由Spring容器初始化、裝配及管理的對象,除此之外,bean就與應用程序中的其他對象沒有什麼區別了。那IoC怎樣確定如何實例化Bean、管理Bean之間的依賴關係以及管理Bean呢?這就需要配置元數據,在Spring中由BeanDefinition代表,後邊會詳細介紹,配置元數據指定如何實例化Bean、如何組裝Bean等。

3、項目搭建好了,讓我們來開發接口,此處我們只需實現打印“Hello World!”,所以我們定義一個“sayHello”接口,代碼如下:

package cn.javass.spring.chapter2.helloworld;  
public interface HelloApi {  
       public void sayHello();  
}  

4、接口開發好了,讓我們來通過實現接口來完成打印“Hello World!”功能;

package cn.javass.spring.chapter2.helloworld;  
public class HelloImpl implements HelloApi {  
              @Override  
              public void sayHello() {  
                     System.out.println("Hello World!");  
              }  
}  

5、接口和實現都開發好了,那如何使用Spring IoC容器來管理它們呢?這就需要配置文件,讓IoC容器知道要管理哪些對象。讓我們來看下配置文件chapter2/helloworld.xml(放到resources目錄下):

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns:context="http://www.springframework.org/schema/context"  
xsi:schemaLocation="  
http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
http://www.springframework.org/schema/context                http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  <!-- id 表示你這個組件的名字,class表示組件類 -->  
<bean id="hello" class="cn.javass.spring.chapter2.helloworld.HelloImpl"></bean>  
</beans> 

6、現在萬一具備,那如何獲取IoC容器並完成我們需要的功能呢?首先應該實例化一個IoC容器,然後從容器中獲取需要的對象,然後調用接口完成我們需要的功能,代碼示例如下:

package cn.javass.spring.chapter2.helloworld;  
import org.junit.Test;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
public class HelloTest {  
       @Test  
       public void testHelloWorld() {  
             //1、讀取配置文件實例化一個IoC容器  
             ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");  
             //2、從容器中獲取Bean,注意此處完全“面向接口編程,而不是面向實現”  
              HelloApi helloApi = context.getBean("hello", HelloApi.class);  
              //3、執行業務邏輯  
              helloApi.sayHello();  
       }  
}  

7、自此一個完整的Spring Hello World已完成,是不是很簡單,讓我們深入理解下容器和Bean吧。
2.2.4 詳解IoC容器
在Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext接口擴展了BeanFactory,還提供了與Spring AOP集成、國際化處理、事件傳播及提供不同層次的context實現 (如針對web應用的WebApplicationContext)。簡單說, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 則增加了更多支持企業級功能支持。ApplicationContext完全繼承BeanFactory,因而BeanFactory所具有的語義也適用於ApplicationContext。
容器實現一覽:
• XmlBeanFactory:BeanFactory實現,提供基本的IoC容器功能,可以從classpath或文件系統等獲取資源;
(1) File file = new File(“fileSystemConfig.xml”);
Resource resource = new FileSystemResource(file);
BeanFactory beanFactory = new XmlBeanFactory(resource);
(2)
Resource resource = new ClassPathResource(“classpath.xml”);
BeanFactory beanFactory = new XmlBeanFactory(resource);

• ClassPathXmlApplicationContext:ApplicationContext實現,從classpath獲取配置文件;
BeanFactory beanFactory = new ClassPathXmlApplicationContext(“classpath.xml”);
• FileSystemXmlApplicationContext:ApplicationContext實現,從文件系統獲取配置文件。
BeanFactory beanFactory = new FileSystemXmlApplicationContext(“fileSystemConfig.xml”);

具體代碼請參考cn.javass.spring.chapter2.InstantiatingContainerTest.java。

ApplicationContext接口獲取Bean方法簡介:
• Object getBean(String name) 根據名稱返回一個Bean,客戶端需要自己進行類型轉換;
• T getBean(String name, Class requiredType) 根據名稱和指定的類型返回一個Bean,客戶端無需自己進行類型轉換,如果類型轉換失敗,容器拋出異常;
• T getBean(Class requiredType) 根據指定的類型返回一個Bean,客戶端無需自己進行類型轉換,如果沒有或有多於一個Bean存在容器將拋出異常;
• Map

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章