Spring IoCjava
1、IoC是Spring容器的內核,AOP、聲明式事務等功能以此爲基礎。web
2、IoC的字面意思爲控制反轉(依賴注入),即某一接口的選擇控制權從調用類中移除,轉給第三方決定。舉例:好比有一個劇本的某一個角色要用劉德華來出演,如今將角色從劇本中分離出來(反轉),由導演來控制(控制)。spring
3、IoC有三種注入方式:構造函數注入(全部的都注入)、屬性注入(可選注入)與接口注入,spring支持前兩種。緩存
經過容器完成依賴關係的注入:即Spring容器經過配置文件或註解描述類與類之間的依賴關係,並完成類的初始化與依賴注入。session
其原理是java語言的反射機制:Class文件由類裝載器(ClassLoder)裝載後,在JVM中造成一份描述Class結構的元信息對象,能夠經過元信息對象獲得類的結構信息,經過此信息對象來完成對類的操做。框架
類裝載器把一個類裝入JVM中,須要以下步驟:函數
1.裝載:查找與導入Class文件post
2.連接:執行校驗(檢查Class文件正確)、準備(類的靜態變量分配空間)和解析步驟spa
3.初始化:靜態變量與靜態代碼塊執行初始化工做prototype
JVM在運行時產生3個ClassLoader:根裝載器(C++)、擴展類裝載器與應用裝載器。
4、Spring設計了一個Resource接口,支持Ant風格帶通配符的資源地址。經過此接口實現了和具體資源的解耦,不管存於何種介質,均可以經過相同的實例返回。
5、BeanFactory和ApplicationContext
Spring IoC容器在完成實例化Bean與創建Bean之間的依賴關係這些底層工做的基礎上,還提供了Bean實例緩存、生命週期管理、Bean實例代理、時間發佈等高級服務。
Bean工廠是Spring框架最核心的接口,使管理不一樣類型的Java對象成爲可能;應用上下文創建在BeanFactoty基礎之上,提供了面向應用的功能,面向Spring自己。通常稱BeanFactory爲IoC容器,ApplicationContext爲應用上下文(Spring容器),面向開發者,絕大多數場合都是直接使用ApplicationContext而不是BeanFactory。
1.BeanFactory
(1)使用XmlBeanDefinitionReader、DefaultListableBeanFactory實現BeanFactory;
(2)Spring經過BeanFactory來實例化、配置和管理對象,可是其只是一個接口,有一個getBean方法,咱們通常不採用BeanFactory而是用ApplicationContext這個類會自動掃描xml,而後經過配置的bean來new對象,將new的對象放進一個map中,鍵爲bean的id,值爲對象。
2.ApplicationContext
(1)使用ClassPathXmlApplicationContext和FileSystemXmlApplicationContext來實現ApplicationContext;WebApplicationContext是專門爲web準備的。
(2)Spring支持基於類註解的方式,源於名爲JavaConfig的子項目@Configuration
(3)WebApplicationContext須要ServletContext與日誌功能(Log4J)
注:非web環境下,Bean只有singlon和prototype兩種做用域;WebApplicationContext爲Bean添加了3個:request、session和globe session.
在web.xml中配置自啓動的Servlet或定義Web容器的監聽器,兩者之一就能夠實現Spring Web應用上下文的工做。
6、Bean的生命週期
BeanFactory中的Bean
1.當調用者經過getBean()請求,若是容器註冊了InstantiationAwareBeanPostProcessor接口,則在實例化前,調用PostProcessBeforeInstantiation()方法
2.根據配置實例化Bean
3.若是容器註冊了InstantiationAwareBeanPostProcessor接口,則在實例化後,調用PostProcessAfterInstantiation()方法
4.配置屬性信息
5.若是Bean實現了BeanNameAware接口,則調用setBeanName()方法,將配置文件中Bean的名稱設置到Bean中
6.若是Bean實現了BeanFactoryAware接口,則調用setBeanFactory()方法,將BeanFactory容器實例設置到Bean中
7.若是BeanFactory裝配了BeanPostProcessor後處理器,postProcessBeforeInitialization()被調用(切入點有關)
8.若是Bean實現了InitializingBean接口,則調用afterPropertiesSet()
9.若是<Bean>中經過init-method屬性定義了初始化方法,則將執行這個方法
10.BeanPostProcessor後處理器有兩個方法,一個在(7)使用,另外一個爲postProcessAfterInitialization(),在此調用
11.若是Bean的做用範圍爲scope = "prototype「,則將Bean返回給調用者,調用者負責Bean後續生命的管理,Spring無論了;若是爲scope = "singleton「,則將Bean放入IoC容器的緩存池中,並將Bean引用返回給調用者,Spring繼續管理Bean的生命。
12.若是Bean實現了DisposableBean接口,則調用destory()方法,在此釋放資源、記錄日誌等
13.對於scope = "singleton「(默認),若是<bean>的destroy-method指定了銷燬方法,將執行這個方法
ApplicationContex的Bean
ApplicationContext來生成並管理Bean的話則稍有不一樣,使用ApplicationContext來生成及管理Bean實例的話,在執行BeanFactoryAware的setBeanFactory()階段後,若Bean類上有實現org.springframework.context.ApplicationContextAware接口,則執行其setApplicationContext()方法,接着才執行BeanPostProcessors的ProcessBeforeInitialization()及以後的流程。