- Bean實例的創(chuàng)建:默認是單例
- 為Bean實例設置屬性,執(zhí)行Bean的屬性的依賴注入
- 依賴注入:構(gòu)造方法注入,set方法注入,注解注入(@Autowired)
- 調(diào)用Bean實例的初始化方法:initializeBean方法
- 如果這個Bean已經(jīng)實現(xiàn)了BeanNameAware接口,會調(diào)用它實現(xiàn)的setBeanName(String)方法,此處傳遞的就是Spring配置文件中Bean的id值
- 如果這個Bean已經(jīng)實現(xiàn)了BeanFactoryAware接口,會調(diào)用它實現(xiàn)的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就可以)
- 如果這個Bean已經(jīng)實現(xiàn)了ApplicationContextAware接口,會調(diào)用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現(xiàn)步驟4的內(nèi)容,但比4更好,因為ApplicationContext是BeanFactory的子接口,有更多的實現(xiàn)方法);
- 如果這個Bean關聯(lián)了BeanPostProcessor接口,將會調(diào)用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經(jīng)常被用作是Bean內(nèi)容的更改,并且由于這個是在Bean初始化結(jié)束時調(diào)用那個的方法,也可以被應用于內(nèi)存或緩存技術;
- 如果Bean在Spring配置文件中配置了init-method屬性會自動調(diào)用其配置的初始化方法。
- 如果這個Bean關聯(lián)了BeanPostProcessor接口,將會調(diào)用postProcessAfterInitialization(Object obj, String s)方法Spring AOP 會在 IOC 容器創(chuàng)建 bean 實例的最后對 bean 進行處理。其實就是在這一步進行代理增強
- 應用可以通過IoC容器使用Bean
- 容器關閉時,調(diào)用Bean的銷毀方法
- 在調(diào)用初始化方法之前,會調(diào)用一系列的aware接口實現(xiàn),把相關的BeanName,BeanClassLoader以及BeanFactory注入到bean中,然后調(diào)用invokeInitMethods之后判斷Bean是否有initMethod,如果有,通過invokeCustomInitMethod方法來直接調(diào)用,然后完成Bean的初始化。
作用域
- singleton:默認值
- prototype:每次從容器中調(diào)用Bean時,都返回一個新的實例,調(diào)用getBean時相當于new Bean
- request:每次HTTP請求都會創(chuàng)建一個新的Bean,該作用域僅僅適用于WebApplicationContext環(huán)境
- session:同一個Http Session共享一個Bean,不同的Session使用不同的Bean,適用于WebApplicationContext環(huán)境
- globalSession:
Spring注解
@controller控制器(注入服務)
@RestController:相當于@ResponseBody+@Controller結(jié)合,返回JSON需要在對應的方法上加@ResponseBody
@service 服務(注入dao)
@repository dao(實現(xiàn)dao訪問)
@component (把普通的pojo實例化到spring容器中,相當于配置文件中<bean id="" class="">)
@EnableAutoConfiguration:借助AutoConfigurationImportSelector.class(SpringFactoriesLoader.loadFactoryNames())可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創(chuàng)建并使用的IoC容器中。
SpringFactoriesLoader:
從META-INF/spring-factories加載配置,有三個靜態(tài)方法:loadFactories:加載指定的factoryClass并進行實例化。loadFactoryNames:加載指定的factoryClass的名稱集合。instantiateFactory:對指定的factoryClass進行實例化。@Autowired和@Resource的區(qū)別
1)都可以用來裝配bean,都可以寫在setter方法上
2)@Autowired默認按類型裝配,默認情況下必須要求依賴對象存在,如果要允許null值,設置require屬性為false:@Autowired(required=false),想要按照名稱裝配,接口@Qualifier使用
3)@Resource注解輸入J2EE,默認按照名稱裝配,名稱可以通過name屬性指定,找不到名稱才按照類型裝配
IOC容器初始化總結(jié):
-
通過setConfigLocations載入spring配置文件;
-
初始化容器入口通過refresh方法,進入AbstractApplicationContext實現(xiàn)的refresh方法。
-
然后通過obtainFreshBeanFactory方法進入子類AbstractRefreshableApplicationContext實現(xiàn)的refreshBeanFactory刷新一個容器工廠
-
在此創(chuàng)建了DefaultListableBeanFactory類,并調(diào)用loadBeanDefinitions(beanFactory)裝載bean定義
-
接著以AbstractRefreshableApplicationContext為中心回到此類,進入其子類AbstractXmlApplicationContext實現(xiàn)的loadBeanDefinitions方法。對applicationContext.xml的解析操作,就是解析工廠的那個xml。
-
再接著通過AbstractXmlApplicationContext的loadBeanDefinitions進入到AbstractBeanDefinitionReader類的loadBeanDefinitions。通過獲取資源方法resourceLoader.getResource(location),獲取到要加載的資源。再真正執(zhí)行加載功能是其子類XmlBeanDefinitionReader實現(xiàn)的loadBeanDefinitions方法。
-
接著進入XmlBeanDefinitionReader中的loadBeanDefinitions。(XmlBeanDefinitionReader通過調(diào)用其父類中調(diào)用的DefaultResourceLoader的getResource方法獲取要加載的資源)DocumentLoader將Bean定義資源轉(zhuǎn)換成Document對象。
-
doLoadBeanDefinitions中進入DefaultBeanDefinitionDocumentReader類的registerBeanDefinitions 解 析 D ocument對象
-
解析完后,調(diào)用DefaultListableBeanFactory類中使用一個HashMap的集合對象存放IoC容器中注冊解析的BeanDefinition
參考地址1
[參考地址2](https://javadoop.com/post/spring-ioc
)