我們都知道,在創建一個spring應用的時候,通過構建spring容器,根據容器獲取bean,那麼spring是如何創建bean的呢?首先在創建bean容器時,通過上下文也就是非BeanFactory創建時,被標記的java對象就會在容器創建時被創建,如代碼所示:
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);
其中依賴注入也在這時候完成,需要注意的是,spring初始化bean是需要步驟的,這個過程類似jvm的類加載機制
1. bean的生命週期
1.1 BeanDefinition
對於一個普通類的實例化過程,當啓動jvm時,代表該類的字節碼文件被加載進內存中,在方法區生成代表這個類的唯一class模板,並通過這個模板在堆中生成對象,但是bean實例化過程卻沒有這麼簡單:
假如在X類上加了@XXX之類的註解,使之能被spring掃描並創建,按道理應該創建X的對象放入spring容器中,其實該不該創建並不能確切的知道,比如該類被設置爲懶加載或者是prototype
類型的就不會立即創建對象,雖然不會創建對象,但spring會創建BeanDefinition
的子類來存儲X類的信息,比如名字,描述信息等,讓後將該對象放進map中
1.2 bean的產生
運行我們的java程序,通過xml文件或者註解的方式都會創建我們的bean容器,這個容器首先會將xml文件中的bean標籤或者被註解的類放進去,那麼這個時候會不會new一個對象呢?答案是不確定的,比如該類被設置爲懶加載或者是prototype
類型的,所以spring會先對它進行解析parse
,將解析的類放進GenericBeanDefinition
這個對象中,並且設置該類的屬性:
通過一系列設置值過後,spring就會根據名稱將這個BeanDefinition對象放進map和list中