BeanFactory和ApplicationContext的區別


疑問:

我看到過很多問 BeanFactory 和 ApplicationContext 不同點的問題,

考慮到這,我應該使用前者還是后者從 Spring 容器中獲取 beans 呢?

 

spring基本功:BeanFactory和ApplicationContext的區別

接口 BeanFactory 和 ApplicationContext 都是用來從容器中獲取 Spring beans 的,但是,他們二者有很大不同

 

(1)什么是 Spring Bean

這是一個非常簡單而又很復雜的問題,通常來說,Spring beans 就是被 Spring 容器所管理的 Java 對象,來看一個簡單的例子

public class myTest {

    private String message;

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

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

在基於 XML 的配置中, beans.xml 為 Spring 容器管理 bean 提供元數據

 

(2)什么是 Spring 容器

Spring 容器負責實例化,配置和裝配 Spring beans,下面來看如何為 IoC 容器配置我們的 HelloWorld POJO

<?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-3.0.xsd">
    <bean id = "helloWorld" class = "com.test.myTest">
        <property name = "message" value = "Hello World!"/>
    </bean>
</beans>

現在,它已經被 Spring 容器管理了,接下來的問題是:我們怎樣獲取它?

 

BeanFactory 和 ApplicationContext 的不同點

這是一個用來訪問 Spring 容器的 root 接口,要訪問 Spring 容器,我們將使用 Spring 依賴注入功能,使用 BeanFactory 接口和它的子接口特性:

  • Bean 的實例化/串聯

通常情況,BeanFactory 的實現是使用懶加載的方式,這意味着 beans 只有在我們通過 getBean() 方法直接調用它們時才進行實例化實現 BeanFactory 最常用的 API 是 XMLBeanFactory

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

ApplicationContext 接口

ApplicationContext 是 Spring 應用程序中的中央接口,用於向應用程序提供配置信息它繼承了 BeanFactory 接口,所以 ApplicationContext 包含 BeanFactory 的所有功能以及更多功能!它的主要功能是支持大型的業務應用的創建特性:

  • Bean instantiation/wiring

  • Bean 的實例化/串聯

  • 自動的 BeanPostProcessor 注冊

  • 自動的 BeanFactoryPostProcessor 注冊

  • 方便的 MessageSource 訪問(i18n)

  • ApplicationEvent 的發布

與 BeanFactory 懶加載的方式不同,它是預加載,所以,每一個 bean 都在 ApplicationContext 啟動之后實例化

public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
        obj.getMessage();
    }

總結

ApplicationContext 包含 BeanFactory 的所有特性,通常推薦使用前者。但是也有一些限制情形,比如移動應用內存消耗比較嚴苛,在那些情景中,使用更輕量級的 BeanFactory 是更合理的。然而,在大多數企業級的應用中,ApplicationContext 是你的首選。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM