一、spring整體生命周期實例化過程
結合圖一圖二總結步驟
1、解析xml文件/注解/配置類等,生成environment對象
2.通過BeanDefinitionReader讀取加載出bean定義信息,然后存放BeanDefinitionRegistry里,(BeanDefinition 包含是不是單例對象 init-method 銷毀方法等屬性)
3、創建beanFactory工廠,Spring容器創建BeanFactoryPostProcessorI
4、調用BeanFactoryPostProcessor的postProcessBeanFactory方法(創建工廠需要做的一些前置處理)
5、beanFactory掃描BeanDefinitionRegistry拿出來所有的BeanDefinition 並把實現了PropertyEditor的Bean注冊到屬性編輯器注冊表里
6、注冊監聽器
7、beanFactory工廠創建/注冊BeanPostProcessor實例,對bean實例化前做一些加工(通過反射創建bean對象 實例之前有一些前置操作 屬性賦值 以及實例化之后的后置操作等等)
8、調用InstantiationStrategy進行對bean的實例化工作(InstantiationStrategy實例化對象相當於代碼中的new 所以沒有屬性賦值)
9、實例化之后使用BeanWapper對bean進行封裝,(beanWapper從BeanDefinitionRegistry獲取BeanDefinition,然后獲取BeanDefinition中的PropertyValue屬性,使用屬性編輯器對PropertyValue進行轉換得到屬性值,在通過反射機制完成bean屬性賦值)
屬性編輯器-吧字面值轉換int/double等類型
10、利用容器中注冊BeanPostProcessor實例對實例化后的對象進行加工
問題:
1.beanFactory和FactoryBean區別/用過FactoryBean做過哪些事
答:都是用來生產對象的 beanFactory創建的對象都是基於一個模板(也就是標准對象),但某些時候需要一些特定條件的對象就可以在FactoryBean的getObject按照自己的需要 做一些獨特的玩法
二、bean實例化過程
1、在需要創建其他Bean實例的時候創建其他Bean
2、調用Bean的構造方法
3、調用Bean的setter方法為Bean屬性賦值
4、如果 bean 實現了 BeanNameAware 接口,Spring 將 bean 的 ID 傳遞給 setBeanName()方法
5、如果 bean 實現了 BeanFactoryAware 接口,Spring 將調用 setBeanFactory()方法,將 BeanFactory 容器實例傳入;
6、如果 bean 實現了 ApplicationContextAware 接口,Spring 將調用 setApplicationContext()方法,將 bean 所在的應用上下文的引用傳入進來
7、如果 bean 實現了 BeanPostProcessor 接口,Spring 將調用它們的 postProcessBeforeInitialization()方法;
8、如果 bean 實現了 InitializingBean 接口,Spring 將調用它們的 afterPropertiesSet()方法。類似地,如果 bean 使用 initmethod 聲明了初始化方法,該方法也會被調用;
9、如果 bean 實現了 BeanPostProcessor 接口,Spring 將調用它們的 postProcessAfterInitialization()方法
10、此時,bean 已經准備就緒,可以被應用程序使用了,它們將一直駐留在應用上下文中,直到該應用上下文被銷毀;
11、如果 bean 實現了 DisposableBean 接口,Spring 將調用它的 destory() 接口方法。同樣,如果 bean 使用 destroymethod 聲明了銷毀方法,該方法也會被調用
四. bean的作用范圍和生命周期
①. 單例對象: scope="singleton"一個應用只有一一個對象的實例。它的作用范圍就是整個引用。
生命周期:
- 對象出生:當應用加載,創建容器時,對象就被創建了。
- 對象活着:只要容器在,對象-直活着。
- 對象死亡:當應用卸載,銷毀容器時,對象就被銷毀了。
②. 多例對象: scope="prototype"每次訪問對象時,都會重新創建對象實例。生命周期:
- 每次訪問對象時,都會重新創建對象實例。
- 對象活着:只要對象在使用中,就一直活着。
- 對象死亡:由java的垃圾回收器機制來處理。