做網(wǎng)站和seo流程網(wǎng)絡(luò)營銷主要干什么
Spring源碼之工廠(容器)
為什么把Spring的工廠又叫做容器呢?
工廠的責(zé)任是創(chuàng)建對象,但是創(chuàng)建完對象后還要進(jìn)行存儲(針對于單例的對象來講),以供其他地方使用,這就是容器。為了能存多個對象,并能方便查找,所以Spring創(chuàng)建的單實例對象是通過類似map的結(jié)構(gòu)來存儲的。
引申一下:
為什么有些人也把tomcat叫做容器?
因為tomcat不僅要創(chuàng)建servelet,還要存儲servelet。
我們最常用的Spring工廠是ApplicationContext(應(yīng)用上下文),這其實是Spring的高級工廠,它復(fù)合了很多的功能,我們在編程的過程中,用它最方便,實際上它的很多功能被Spring提供的其他的工廠分擔(dān)了。所以我們可以認(rèn)為ApplicationContext是編程過程中的一個門面。
正因為它的功能太多,所以我們在分析源碼的時候,如果先從它入手,會分析亂了。
這個時候,我們就要找到Spring最為核心且典型的工廠——BeanFactory。
BeanFactory
BeanFactory是接口,我們先來看下BeanFactory的實現(xiàn)結(jié)構(gòu)圖。
它們的功能是什么呢?我們選擇一些重要的來介紹一下。
-
BeanFactory:Spring體系中,最底層的工廠,定義了工廠的最基本操作。比如,存或取bean;
-
HierarchicalBeanFactory:提供了父子容器管理的功能;
-
AutowireCapableBeanFactory:
-
提供了自動注入的功能;
-
還提供intinitialBean(初始化單例bean時調(diào)用其中的afterPropertieSet方法)、DisposeBean(銷毀單例bean之前調(diào)用其中的destory方法)的功能;
-
-
ListableBeanFactory:可以獲取相關(guān)的配置信息 ,比如constrainsBeanDefinition、getBeanNameForType等信息;
-
ConfigurableBeanFactory:提供了如下功能:
配置創(chuàng)建的是單實例還是多實例 (scope)、類型轉(zhuǎn)換器的功能,后置處理Bean的功能;
-
DefaultListableBeanFactory:符合上述所有主要工廠能力 的一個類型;
-
XmlBeanFactory:內(nèi)部有XmlBeanDefinitionReader的工具類,可以使用基于XML配置的信息,完成對象的創(chuàng)建;
-
ApplicationContext:集工廠功能大成的類型,編程時使用。
我們主要使用XmlBeanFactory來分析Spring工廠,之所以用它,是因為其內(nèi)部有XmlBeanDefinitionReader工具類,可以讀取xml的信息。
獲取對象的簡單代碼演示:
//1. 讀取XML配置文件,XML配置文件 封裝 Java對象 ---> 創(chuàng)建工廠生產(chǎn)的對象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
//2. 從工廠容器中獲得對象
User user = (User) beanFactory.getBean("u");