IOC容器從BeanFactory獲取Bean原始碼淺析
我們經常說IOC容器,它具體由誰來充當這個角色呢,我的理解ApplicationContext是用來管理IOC容器中的Bean的,IOC容器本質上是由DefaultListableBeanFactory擔當的。
我們想從容器中獲得某個Bean,是通過ApplicationContext來獲取的,實際實現是從容器DefaultListableBeanFactory取的,比如下面這樣:
public class BeanExample { public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");//建立bean UserService userService = (UserService) applicationContext.getBean("userService");//獲取bean userService.hello("haha"); } }
<bean id="userService" class="com.hand.user.dal.UserServiceImpl" scope="prototype"/> <!--指定例項化型別為原型-->
<bean id="studentService" class="com.hand.user.dal.StudentServiceImpl"/> <!--預設是單例-->
先看看beans.xml中定義的bean是如何例項化到Ioc容器中的。
這個過程是,把beans.xml轉換為io流,通過io流來讀取解析<bean>標籤。將所有解析到的BeanDifinition載入到DefaultListableBeanFactory中快取起來。最後在獲取Bean時,根據BeanDifinition將Bean例項化到Ioc容器。
這裡我們獲取的是原型Bean,看下它怎麼取的。
說明幾個概念:
ListableBeanFactory:可列表Bean工廠,是所有bean的集合(IOC容器)。
HierarchicalBeanFactory:有繼承關係的Bean工廠,定義bean之間的關係。
AutowireCapableBeanFactory:自動裝配Bean工廠,定義bean的行為,比如:裝配Bean,解決bean之間的依賴。
預設的單例Bean,在容器初始化時,就例項化到快取中了,只例項化一次,多次共享。
原型Bean,是在每次請求時,才例項化,所以有多個例項,是獨立的。