1、生成類信息map
掃描包,用asm技術獲取類信息,打了@ComponentScan@component@service等注解的類會放入map。key是類名,value是beanDefinition類的基本信息
2、加載類
context.getBean("userService")
從類信息map中獲取beanDefinition,并加載類。如果加載了會記錄下來,如果沒加載就調用類加載器去加載類
3、創建bean對象
創建對象過程是:實例化(1-3)、處理屬性(5-7)、初始化(8-10)。
1.實例化前。InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
2.實例化
3.實例化后。MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
4.InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
5.自動注入(依賴注入)
6.屬性處理。InstantiationAwareBeanPostProcessor.postProcessProperties()。如@autowired
7.回調處理一些類信息。Aware對象
8.初始化前。BeanPostProcessor.postProcessBeforeInitialization()
9.初始化。執行InitializingBean初始化接口
10.初始化后。BeanPostProcessor.postProcessAfterInitialization()。如aop
創建出來的bean如果是單例,放到map中,key是bean名稱,value是bean對象。如果是原型類,則不放入map,每次都執行上述的創建對象過程
實例化:先在beanDefinition中的supplier有沒有返回對象,沒有的話看beanFactory。實例化涉及推斷構造方法。推斷構造方法就是只有一個構造方法、執行這個構造方法;多個構造方法,執行@Autowired方法或者無參構造。有參構造的入參,回去beanMap中找,沒有就創建。
aop:如果有aop則創建的bean是代理對象,執行流程是userService.test() --> aop切面邏輯如@before--> target.test()。 target是被代理對象
aop流程:找所有的切面類@Aspect、找切面中所有的pointCut,如@before@after等,看當前要創建的bean是否是pointCut需要的,是就創建代理對象
4、銷毀bean
出發時機:spring容器關閉時
創建bean后,會把實現了DisposableBean接口的bean保存到一個map中,銷毀容器AnnotationConfigApplicationContext.close()的時候會逐步處理清空這個map中的對象。
適配器模式:實現了AutoCloseable接口,或者在BeanDefinition中指定了destroyMethodName的都算是要銷毀的。所以會把實現了AutoCloseable接口的類封裝成DisposableBeanAdapter,而DisposableBeanAdapter實現了DisposableBean接口。