javascript
Spring里的容器和Bean对象
"控制反轉"是指new實例工作不由程序員來做而是交給Spring容器來做。在Spring中BeanFactory是IOC容器的實際代表者。
Spring 容器是 Spring 框架的核心。容器將創建對象,把它們連接在一起,配置它們,并管理他們的整個生命周期從創建到銷毀。Spring 容器使用依賴注入(DI)來管理組成一個應用程序的組件。這些對象被稱為 Spring Beans.
通過閱讀配置元數據提供的指令,容器知道對哪些對象進行實例化,配置和組裝。配置元數據可以通過 XML,Java 注釋或 Java 代碼來表示。
Spring IoC 容器利用 Java 的 POJO(plain old Java object) 類和配置元數據來生成完全配置和可執行的系統或應用程序。
Spring的兩種容器實現:
(1) Spring BeanFactory 容器:最簡單的容器,給 DI 提供了基本的支持,它用 org.springframework.beans.factory.BeanFactory 接口來定義。BeanFactory 或者相關的接口,如 BeanFactoryAware,InitializingBean,DisposableBean等
 (2) Spring ApplicationContext 容器:該容器添加了更多的企業特定的功能,例如從一個屬性文件中解析文本信息的能力,發布應用程序事件給感興趣的事件監聽器的能力。該容器是由 org.springframework.context.ApplicationContext 接口定義。
在我測試的Spring 5.0.2中,BeanFactory已經被標注為Deprecated了:
ApplicationContext 包含 BeanFactory 所有的功能,一般情況下,相對于 BeanFactory,ApplicationContext 會更加優秀。當然,BeanFactory 仍可以在輕量級應用中使用,比如移動設備或者基于 applet 的應用程序。
最常被使用的 ApplicationContext 接口實現:
- ClassPathXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這里,不需要提供 XML 文件的完整路徑,只需正確配置 CLASSPATH 環境變量即可,因為容器會從 CLASSPATH 中搜索 bean 配置文件。
- FileSystemXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這里,需要提供給構造器 XML 文件的完整路徑。
看個FileSystemXmlApplicationContext的例子:
輸出:
Bean對象
被稱作 bean 的對象是構成應用程序的支柱也是由 Spring IoC 容器管理的。bean 是一個被實例化,組裝,并通過 Spring IoC 容器所管理的對象。這些 bean 是由用容器提供的配置元數據創建的。
Spring IoC 容器完全由實際編寫的配置元數據的格式解耦。有三種方法把配置元數據提供給 Spring 容器:
(1) 基于 XML 的配置文件
 (2) 基于注解的配置
 (3) 基于 Java 的配置
Bean的作用域
- singleton:在spring IoC容器僅存在一個Bean實例,Bean以單例方式存在,默認值
- prototype: 每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時,相當于執行newXxxBean()
- request: 每次HTTP請求都會創建一個新的Bean,該作用域僅適用于WebApplicationContext環境
- session:同一個HTTP Session共享一個Bean,不同Session使用不同的Bean,僅適用于WebApplicationContext環境
- global-session:一般用于Portlet應用環境,該運用域僅適用于WebApplicationContext環境
singleton
Singleton是默認的作用域,也就是說,當定義 Bean 時,如果沒有指定作用域配置項,則 Bean 的作用域被默認為 singleton.
看個例子:
無論用context API獲取多少次作用域為singleton的Bean對象,Spring IOC容器中只會存在一個Bean對象的實例。
Bean對象的實例什么時候創建的?
從調用棧能看出,是在Spring IOC容器創建時進行Bean實例的創建。
把scope改成prototype再試:
這次,scope為prototype的Bean對象一共實例化了兩次,因為兩次構造函數被調用了:
從調試器的調用棧能發現,prototype作用域的Bean對象,實例化發生延遲至其真正被請求時。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
 
總結
以上是生活随笔為你收集整理的Spring里的容器和Bean对象的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: dnf圣者遴选属性怎么选
- 下一篇: Spring Bean 后置处理器Pos
