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