IoC 容器

Spring 容器時Spring 框架的核心。容器負責創建對象,並將它們連接在一起,配置對象,並且管理它們的生命週期。Spring容器使用依賴注入Dependency Injection 來管理組成一個應用程序的組件。這些對象被稱爲Spring Beans,我們將在下一章討論。

通過讀取配置,容器可以知道哪些對象進行實例化、配置和組裝。這個配置可以通過XML、java註解以及java配置的方式。下圖從高層次展示了Spring如何工作的。
image

Spring IoC 容器使用Java POJO 類和配置去完成一個系統和應用程序。

容器

No Container & Description
1 Spring BeanFactory Container
這是一個簡單的容器,提供基本的依賴注入的支持。BeanFactory容器由org.springframework.beans.factory.BeanFactory接口實現。BeanFactory以及相關接口,比如BeanFactoryAware、InitializingBean、DisposableBean仍然存在於Spring中以便與Spring集成的第三方框架向後兼容。
2 Spring ApplicationContext Container
ApplicationContext容器增加了很多企業級的功能,比如從屬性文件中解析文本消息的能力以及發佈應用程序事件到感興趣的事件監聽器上。ApplicationContext是由org.springframework.context.ApplicationContext接口定義的。

ApplicationContext容器包含BeanFactory容器的所有功能,所以推薦使用ApplicationContext容器。

Spring BeanFactory Container

這是一個由org.springframework.beans.factory.BeanFactory接口定義的簡單容器,提供基本的依賴注入。BeanFactory和相關的接口,比如BeanFactoryAwareDisposableBean仍然在Spring中支持,爲了兼容大量的第三方的框架。

對於BeanFactory接口由一系列的實現,都是可以直接使用的。常用的BeanFactory的實現是XmlBeanFactory類。這個容器從XML配置文件中讀取配置元數據,並且使用它創建的完整配置的系統和應用。

當設備資源有限的情況下,可以使用BeanFactory,比如移動設備以及基於applet的應用。因此,推薦使用ApplicationContext,除非你有不使用它的原因。

Example

HelloWorld.java

package com.soygrow.BeanFactory;

public class HelloWorld {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void getMessage() {
        System.out.println("Your Message : " + message);
    }
}

MainApp.java

package com.soygrow.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class MainApp {
    public static void main(String[] args) {
        XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("FactoryBeans.xml"));
        HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
        obj.getMessage();
    }
}

FactoryBeans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloWorld" class="com.soygrow.BeanFactory.HelloWorld">
        <property name="message" value="Hello World!"/>
    </bean>
</beans>

如果一切正常,運行的結果:

Your Message : Hello World!

代碼說明
- 第一步使用框架API XmlBeanFactory()創建一個工廠對象,使用ClassPathResource() API加載CLASSPATH配置文件中的bean。XmlBeanFactory()很好的創建並初始化所有對象。
- 第二部使用getBean()方法獲取工廠對象創建的bean對象。這個方法使用bean ID 返回一個生成的對象(能夠被裝換成實際的對象)。一旦你擁有對象,就可以調用該對象的任何方法。

Spring ApplicationContext Container

ApplicationContext 是Spring的高級容器,和BeanFactory類似,它能夠加載bean定義、綁定bean並且根據請求分發bean實例。除此之外,它增加了企業級的功能,能夠在對應的事件Listener上發佈對應的Event。這個容器是由org.springframework.context.ApplicationContext接口定義的。

ApplicationContext包含BeanFactory所有的功能,推薦使用ApplicationContext。BeanFactory仍然可以在輕量的應用程序中使用,比如移動設備和applet的應用。

通常被使用的ApplicationContext的實現有:
- FileSystemXmlApplication 該容器從XML配置文件中加載beans的定義。因此,你需要提供XML配置的全路徑給該容器的構造器
- ClassPathXmlApplicationContext 該容器從XML配置文件中加載beans的定義。這裏你不需要提供XML配置的全路徑,但是需要設置CLASSPATH,因爲該容器回在CLASSPATH中查找bean配置的XML文件。
- WebXmlApplicationContext 該容器從XML配置文件中加載一個web應用程序的所有beans的定義

下面具體參考例子程序。

Example

HelloWorld.java

package com.soygrow.ApplicationContext;

public class HelloWorld {
    private String message;

    public void getMessage() {
        System.out.println("Your message : " + message);
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

MainApp.java

package com.soygrow.ApplicationContext;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext("//Users/zhanghao53/IdeaProjects/JKXY/HelloSpring/WEB-INF/ApplicationBeans.xml");

        HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
        helloWorld.getMessage();
    }
}

ApplicationBeans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "helloWorld" class = "com.soygrow.ApplicationContext.HelloWorld">
        <property name = "message" value = "Hello World!"/>
    </bean>
</beans>

如果一切正常,運行結果:

Your message : Hello World!

代碼分析
- 第一步根據全路徑的XML配置文件,使用FileSystemXmlApplicationContext創建工程對象。FileSystemXmlApplicationContext()方法會很好的初始化XML配置文件中所有beans的對象
- 第二步使用getBean()方法獲取bean對象。通過Bean ID 返回一個生成的bean對象,最終會被轉換成真實的對象。當有了對象就可以通過對象來訪問他的方法。

Spring教程專欄地址:http://blog.csdn.net/column/details/19452.html

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